【问题标题】:C# Reflection, assembly.load byte[]C# 反射,程序集.load byte[]
【发布时间】:2013-05-29 18:05:06
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    如果我多次调用 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 中。

    【讨论】:

    • 这很有趣,但为什么我只看到调试器的“模块”中加载了 1 个程序集?。
    • 你是对的,程序集被加载了很多次。现在我要尝试将它们加载到 AppDomain 中,问题是,我给它起什么名字?它必须是独一无二的吗?当对方法的多个并发调用发生并且它们都尝试创建应用程序域并加载程序集时会发生什么?
    • 谢谢。我创建了一个使用 Dictionary 的 AssemblyLoader 对象,其中 string 是文件名 + 文件日期作为长附加到它。如果程序集已经加载,它不会再次加载它并返回已经加载的程序集。 github.com/rhyous/SimplePluginLoader/blob/master/…
    猜你喜欢
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2017-05-26
    相关资源
    最近更新 更多