C# .net自动程序集解析加载重复程序集

C# .net自动程序集解析加载重复程序集,c#,.net-assembly,appdomain,C#,.net Assembly,Appdomain,我有一个依赖于库的可执行文件。我还有一个“加载程序”应用程序,它将可执行文件加载到一个单独的AppDomain(我的“沙盒”)中并在那里运行。库需要从沙箱外部初始化,因此我需要在加载可执行文件之前加载库。这与预期的一样,但是当我现在加载可执行文件时,库将在另一次加载,可执行文件将使用未初始化的副本 仅当我按以下方式加载库时才会发生此情况: Assembly.Load(File.ReadAllBytes(assemblyFile.FullName)); 与此相反: Assembly.LoadF

我有一个依赖于库的可执行文件。我还有一个“加载程序”应用程序,它将可执行文件加载到一个单独的AppDomain(我的“沙盒”)中并在那里运行。库需要从沙箱外部初始化,因此我需要在加载可执行文件之前加载库。这与预期的一样,但是当我现在加载可执行文件时,库将在另一次加载,可执行文件将使用未初始化的副本

仅当我按以下方式加载库时才会发生此情况:

 Assembly.Load(File.ReadAllBytes(assemblyFile.FullName));
与此相反:

Assembly.LoadFrom(assemblyFile.FullName);
但是,使用LoadFrom会锁定文件。我需要能够删除/写入文件,因为我的应用程序需要能够重新加载整个沙盒和其中的所有程序集

我还尝试注册AppDomain.AssemblyResolve,但它只有在找不到文件时才会被调用,而这正是我想要的

日志输出示例:

  • 从以下位置加载库X:

    请注意,此方法重载始终使用自己的映射创建新的程序集对象

    如果希望重用加载的程序集,则不能使用该重载(无论如何,如果没有额外的工作,框架不会自动为您执行此操作)

    您可能可以在这里使用
    Assembly.Load(string)
    或仅使用
    Type.GetType(string)
    方法,但我怀疑这仍然会锁定要修改的文件。老实说,我不知道如何在运行时修改这些文件——如果删除或更改加载的程序集,预期的行为是什么?重新加载?修改后的代码是否已输入内存


    您可能需要创建自己的某种程序集缓存机制。如果程序集没有那么大,并且您可以将它们保存在内存中,那么它可能像
    字典一样简单,只需在加载程序集之前检查字典中是否有您的程序集,否则请使用
    assembly.load(字节[])加载它
    你现在的样子。

    我最终修改了沙盒的AppDomainSetup:

    domainSetup.DisallowApplicationBaseProbing = true;
    

    现在,每次都将调用AssemblyResolve(没有程序集的自动发现)。现在我可以从字节[]加载程序集并缓存它们(感谢@DanField建议缓存程序集)

    这两个加载都发生在同一个AppDomain中吗?@DanField是的,我仔细检查了一下