【发布时间】:2012-02-09 19:25:00
【问题描述】:
环境:C#、.NET 4.0 和混合模式。
我有一个包含多个第三方依赖项的复杂应用程序。当我们收到一些应用程序崩溃的报告时,我们添加了一些健全性检查,以通过遍历 Assembly 依赖项来确保所有依赖项都存在。不幸的是,这不会检查我们的应用程序使用的本机 DLL 文件是否存在。我们预期的解决方案是遍历所有 DLL 名称,并确保至少有一个具有该名称的文件作为完整性检查。
问题
Directory.EnumerateFiles() 和 File.Exists() 也看不到这些原生 DLL。重现这个问题的代码就像教科书《如何列出文件》一样简单:
foreach(string file in
Directory.EnumerateFiles(Environment.CurrentDirectory, "*.dll"))
{
string entry = Path.GetFileName(file);
if (! RequiredFiles.Contains(entry))
{
/* Do error handling */
}
}
盯着我列出文件的目录,我可以看到我想要检测的文件。它们不会以任何方式标记为系统文件。然而,无论我是否有过滤器文本,都只列出了 .NET DLL 文件。我想更直接地重写这段代码,结果却是一样的沮丧:
foreach(string dependency in RequiredFiles)
{
string fileName = Environment.CurrentDirectory + '\\' + dependency;
if(! File.Exists(fileName))
{ /* do error handling */ }
}
我得到了完全相同的结果。 .NET 似乎看不到所有本机 DLL 文件。
问题
这是什么原因造成的?更重要的是,如果我什至在文件系统中都看不到原生 DLL 文件,如何检测它们是否存在?
【问题讨论】:
-
你能在一个空白项目中重现这个吗?我严重怀疑原生 DLL 真的会像那样“不可见”。听起来好像发生了其他事情;错误的 CurrentDirectory、某种影子复制、64 位操作系统文件系统重定向上的 32 位进程等。ClickOnce 部署可能会忽略本机 DLL。类似的东西。