2012-10-26 67 views
0

我有一个可执行文件,比如abc.exe,它引用a.dll(与可执行文件相同的文件夹),b.dll(随机文件夹中)和c.dll(随机文件夹中)。使用System.Diagnostics.Process来反映引用的程序集?

但是,这些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(?)

不过,我不不知道如何去做。这是否可能,如果是这样,那该怎么办?谢谢!

+0

如果exe或dll的分发者没有将依赖关系放在相同的位置或GAC中作为调用它们的文件,那么应用程序可能会从dll或exe中使用Assembly编码的指定位置动态地加载它们解决...如果是这种情况,我怀疑你会通过反射找到位置... – devHead

+0

这是正确的唐,有一段代码捕捉程序集没有发现异常(不知道它被称为是什么)和引用到一个文本文件来查找特定的位置。 我不想做的就是依赖这个文本文件。在这种情况下不可能吗? – r3su

+1

你看到了吗? http://msdn.microsoft.com/en-us/magazine/cc163641.aspx – devHead

回答

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); 
     } 
    } 

模块名在哪里给你的程序集的名称和文件名给你正确的装配路径,无论它在哪里是(在网络上,在C:\ Windows等)

但是,我无法弄清楚当一个可执行文件完成加载所有模块时如何'检测'。如果我删除了睡眠线,我只能看到部分模块列表,我想这些模块是通过时间过程加载完成的。模块被调用。

相关问题