8

我正在处理一项任务,我必须加载 dll 并从中获取一些信息,例如类名等......但是当我将该 dll 加载到我的代码中时,它会被锁定并且无法从源代码构建,直到我关闭了加载程序,我尝试了某些解决方案,但它们都不适合我

  1. Shadowcopy:在这种情况下,当我影子复制程序集时,如果我在
    我的主 dll 中更改了某些内容,那么它在我的加载应用程序中仍然是旧的。

  2. System.Reflection.assembly.loadfrom(System.IO.GetBytes("asm-path")); //有时工作但并不总是

  3. System.Reflection.assembly.ReflectionOnlyConext(); //不起作用

有没有适当的解决方案

4

2 回答 2

25

一种方法是读取文件的字节并使用 Assembly.Load 的重载,它接收一个字节数组,类似于您在第二个示例中所做的。我不确定是什么System.IO.GetBytes,但请尝试File.ReadAllBytes

byte[] assemblyBytes = File.ReadAllBytes("asm-path");
var assembly = Assembly.Load(assemblyBytes);

但是,这可能还不够,具体取决于您要执行的操作,因为您无法在加载程序集后将其卸载。要解决此问题,如果需要,可以将程序集加载到其自己的AppDomain 中,然后在完成后卸载 AppDomain。

AppDomain ad = AppDomain.CreateDomain("New_Assembly_AD");
byte[] assemblyBytes = File.ReadAllBytes("asm-path");
var assembly = ad.Load(assemblyBytes);  

完成assembly对象后,您可以卸载 AppDomain。

AppDomain.Unload(ad);
于 2013-09-21T18:17:18.243 回答
0

也许只是在检查信息后尝试发布文件?这样它可能只会被锁定几毫秒。

如果这不起作用。复制dll并使用副本...

如果您想在 dll 更改时刷新信息,您可以编写一个目录侦听器并在原始 dll 更新时执行某些操作。

于 2013-09-21T18:12:21.723 回答