環境: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ファイルが検出されるのでしょうか?
あなたは空白のプロジェクトでこれを再現することはできますか?私はネイティブのDLLが実際には "不可視"になることに深刻な疑念を持っています。それは他の何かが起こっているように聞こえる。間違ったCurrentDirectory、ある種のシャドウコピー、64ビットOSファイルシステムのリダイレクトなどの32ビットプロセスなどがあります。ネイティブDLLはClickOnceの配備によって無視されることがあります。そのようなもの。 –