c# - 为什么 AssemblyResolve 不起作用?

标签 c# .net plugins appdomain

我真的很奇怪为什么 assemblyResolver 不工作?我也不能用

foreach(deCompressBinaries 中的 byte[] 二进制文件)
ApplicationHost.Load(二进制);

如何触发 AssemblyResolve?请看我的引用问题:http://stackoverflow.com/questions/9721686/how-to-use-appdomain-createdomain-with-assemblyresolve

    protected void LoadApplication()
    {

        AppDomainSetup domainSetup = new AppDomainSetup();
        domainSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
        domainSetup.DisallowBindingRedirects = false;
        domainSetup.DisallowCodeDownload = true;
        domainSetup.LoaderOptimization = LoaderOptimization.SingleDomain;
        //domainSetup.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
        ApplicationHost = AppDomain.CreateDomain("Test.Service", null, domainSetup);
        object obj = ApplicationHost.CreateInstanceAndUnwrap("Test.Process", "Test.ApplicationLoader");

        Assembly objExecutingAssemblies = Assembly.GetExecutingAssembly();
        AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies();

        foreach (AssemblyName assName in arrReferencedAssmbNames)
        {
            ApplicationHost.Load(assName);
        }


        ApplicationHost.AssemblyResolve += new ResolveEventHandler(OnAssemblyResolve);

        List<byte[]> deCompressBinaries = new List<byte[]>();
        foreach (var item in AppPackage.Item.AssemblyPackage)
            deCompressBinaries.Add(item.Buffer);
        var decompressvalues =  DeCompress(deCompressBinaries);
        deCompressBinaries.Clear();
        deCompressBinaries = decompressvalues.ToList();

        foreach (byte[] binary in deCompressBinaries)
            ApplicationHost.Load(binary);

        Assembly[] assAfter = AppDomain.CurrentDomain.GetAssemblies();
    }

    Assembly OnAssemblyResolve(object sender, ResolveEventArgs args)
    {
        return Assembly.Load(args.Name);
    }

最佳答案

AssemblyResolve 永远不会触发,因为您正在加载 LoadApplication 方法中的所有程序集 - AssemblyResolve 只会在以下情况下被调用所需的程序集引用无法解析。

我建议运行 fuslogvw.exe这样您就可以直观地了解正在发生的事情。

如果您想按需加载程序集,代码块:

List<byte[]> deCompressBinaries = new List<byte[]>();
foreach (var item in AppPackage.Item.AssemblyPackage)
deCompressBinaries.Add(item.Buffer);
var decompressvalues =  DeCompress(deCompressBinaries);
deCompressBinaries.Clear();
deCompressBinaries = decompressvalues.ToList();

foreach (byte[] binary in deCompressBinaries)
    ApplicationHost.Load(binary);

Assembly[] assAfter = AppDomain.CurrentDomain.GetAssemblies();

需要在 AssemblyResolve 中工作。该 block 当前将所有内容加载到 AppDomain 中,因此您必须重新处理该逻辑。

当然,您可能想要做的另一件事不是重新发明轮子,而是使用 ILMerge .

关于c# - 为什么 AssemblyResolve 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9734657/

相关文章:

C# - 无法访问所有文件

c# - 套接字:将字符串从 Java 发送到 C#?

java - RCP - 如何对面板内的按钮使用现有命令?

visual-studio-2008 - Visual Studio 临时工具和插件

python - 从 sublime_plugin.WindowCommand 获取当前文件名

c# - 现实世界的数组协方差问题

c# - 编译器歧义调用错误-具有Func <>或Action的匿名方法和方法组

java - 从 Java 到 .Net

公共(public)数据表的 C# SQL 查询

c# - C#重构问题