我使用 Assembly.Load(byte[]) 动态加载一些 dll,用户在需要时添加这些 dll。如果我多次调用 Assembly.Load(byte[]) 会发生什么,因为那个 byte[] 从同一时间加载?我问这个是因为在我的程序中,每次需要时都会调用加载 dll,而不是在某处保存对它的引用。它会多次加载同一个dll吗?它会只加载一次并更新已经加载的吗?检查 Visual Studio 调试器只有一个 dll 副本,所以看起来不错,但又引发了另一个问题。我试图修改 dll,并添加一个新的(带有较新版本的)现在有两个 dll 文件,旧的和新的,我调用 Assembly.Load(byte[]) 到它们(旧的和新的),一个一个,像这样:加载旧的dll,使用它,加载新的dll,使用它。他们工作正常,旧的和新的,但只有一个加载了,所以这让我觉得第二次加载会覆盖旧的,这是如何工作的?我有任何风险吗?如果多个用户加载它们会发生什么?(例如,使用加载和使用两个 dll 的方法的 Web 应用程序)
问问题
1727 次
1 回答
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,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089 WhoCares,版本=1.0.0.0,文化=中性,PublicKeyToken=null WhoCares,版本=1.0.0.0,文化=中性,PublicKeyToken=null WhoCares,版本=1.0.0.0,文化=中性,PublicKeyToken=null WhoCares,版本=1.0.0.0,文化=中性,PublicKeyToken=null 按任意键继续 。. .
我有任何风险吗?
没有Assembly.Unload
或AppDomain.UnloadAssembly
。加载后您根本无法从 AppDomain 中卸载它。这意味着您无法释放该内存,因此每次加载程序集时,您都在分配永远无法取回的内存。解决此问题的唯一方法是将程序集加载到单独的 AppDomain 中。
于 2013-05-29T19:32:37.777 回答