0

a.dll(実行可能ファイルと同じフォルダー)、b.dll(ランダムフォルダー内)、およびc.dll(ランダムフォルダー内)を参照する実行可能ファイル、たとえばabc.exeがあります。

ただし、これらの DLL は必ずしも実行可能ファイル (または GAC) と同じディレクトリにあるとは限りません。これについては、私にはどうすることもできません。

System.Reflection.Assembly を使用して、abc.exe によって使用されるすべての参照アセンブリを見つけようとしました。

foreach (AssemblyName an in assembly.GetReferencedAssemblies())
{
    Assembly.Load(an);
}

これにより、実行可能ファイルのディレクトリ (a.dll) にあるアセンブリが読み込まれるように見えますが、驚くことではありませんが、他のアセンブリに対してファイルが見つからないという例外がスローされます。

私の考えは、System.Diagnostics.Process を使用してプロセスをロードし、プロセスを反映することです。これにより、b.dll と c.dll(?) の場所がわかるはずです。

しかし、私はそうする方法がわかりません。これは可能ですか?ありがとう!

4

1 に答える 1

0

したがって、これは System.Diagnostic.Process で実行できることがわかります。たとえば、次のようになります。

public void findModules(string executablePath)
    {
         Process process = new Process();
         process.StartInfo.FileName = executablePath;
         process.Start();
         process.WaitForInputIdle();
         System.Threading.Thread.Sleep(10000);

         ProcessModuleCollection mods = process.Modules;

         foreach (ProcessModule m in mods)
         {
            Console.WriteLine(m.ModuleName + ":" + m.FileName);
         }
  }

ModuleName はアセンブリの名前を示し、FileName はアセンブリの場所 (ネットワーク上、C:\Windows など) に関係なく、正しいアセンブリ パスを示します。

ただし、実行可能ファイルがすべてのモジュールのロードを完了したときに「検出」する方法がわかりません。sleep 行を削除すると、モジュールの部分的なリストのみが表示されます。これは、process.Modules が呼び出されるまでにロードが完了したモジュールであると推測されます。

于 2012-11-01T17:09:25.327 に答える