C#Reflection,assembly.load byte []

时间:2013-05-29 18:05:07

标签: c#-4.0 reflection dll .net-assembly

我使用Assembly.Load(byte [])来动态加载一些dll,用户在需要时添加这些dll。 如果我多次调用Assembly.Load(byte []),从同一时间加载byte []会发生什么?我问这个是因为在我的程序中,每次需要时都会调用加载dll,而不是在某处保存对它的引用。它会多次加载相同的dll吗?它只加载一次并更新已加载的吗?检查visual studio调试器只有一个dll副本所以看起来很好,但提出了另一个问题。 我试图修改dll,并添加一个新的(有一个更新的版本)现在同时拥有dll文件,旧的和新的,并且我调用Assembly.Load(byte [])到他们两个(旧的和新的),一个接一个,像这样:加载旧的DLL,使用它,加载新的DLL,使用它。它们工作得很好,无论是旧的还是新的,但只有其中一个加载,所以这让我觉得第二个负载会覆盖旧的,这是如何工作的?我有风险吗?如果多个用户加载它们会发生什么? (例如,使用加载和使用两个dll的方法的Web应用程序)

1 个答案:

答案 0 :(得分:2)

我无法回答你所有的问题,因为我不知道所有这些问题。但我想你可以编写一个测试应用程序来找出其他一些。

  

如果我多次调用Assembly.Load(byte []),同时加载byte []会怎么样?

每次调用Assembly.Load(byte[])时都会加载一个新的程序集,无论你是使用相同的字节数组还是每次都从文件中读取它。

你可以自己检查一下:

// WhoCares.exe is the name of this program
var bytes = File.ReadAllBytes(@"WhoCares.exe");

var asm1 = Assembly.Load(bytes);
var asm2 = Assembly.Load(bytes);
var asm3 = Assembly.Load(bytes);

var domainAssemblies = AppDomain.CurrentDomain.GetAssemblies();

foreach (var asm in domainAssemblies)
{
    Console.WriteLine(asm.FullName);
}

输出:

mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
WhoCares, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
WhoCares, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
WhoCares, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
WhoCares, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Press any key to continue . . .
  

我有任何风险吗?

没有Assembly.UnloadAppDomain.UnloadAssembly。加载后,您无法从AppDomain卸载。这意味着你无法释放内存,所以每次加载程序集时,你都会分配你永远不会回来的内存。解决这个问题的唯一方法是将程序集加载到单独的AppDomain中。