環境:C#,.NET 4.0和混合模式。Directory.EnumerateFiles和File.Exists忽略本機DLL文件
我有一個複雜的應用程序與幾個第三方依賴項。當我們收到應用程序崩潰的一些報告時,我們添加了一些完整性檢查,以確保遍歷程序集依賴關係存在所有依賴關係。不幸的是,這並不檢查我們的應用程序使用的本機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 */ }
}
我得到了同樣的確切結果。所有本機DLL文件似乎對.NET不可見。
問題
是什麼原因造成的?更重要的是,如果我甚至無法在文件系統中看到它們,我如何檢測本機DLL文件是否存在?
你能在一個空白的項目重現此?我非常懷疑原生DLL是否真的是「隱形」的。這聽起來像是其他事情正在發生;錯誤的CurrentDirectory,某些類型的影子複製,64位操作系統文件系統重定向上的32位進程等。本機DLL可能會被ClickOnce部署忽略。像這樣的東西。 – 2012-02-09 20:33:21