0

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

4

1 回答 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.UnloadAppDomain.UnloadAssembly。加载后您根本无法从 AppDomain 中卸载它。这意味着您无法释放该内存,因此每次加载程序集时,您都在分配永远无法取回的内存。解决此问题的唯一方法是将程序集加载到单独的 AppDomain 中。

于 2013-05-29T19:32:37.777 回答