使用 AppDomain 将 DLL 作为嵌入式资源文件加载

Posted

技术标签:

【中文标题】使用 AppDomain 将 DLL 作为嵌入式资源文件加载【英文标题】:Using AppDomain to load DLL as embedded resource file 【发布时间】:2019-01-17 23:19:59 【问题描述】:

我怎样才能加载超过 1 个文件 DLL 使用

(( AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler() ))

这只是第一个工作,但另一个不工作?! 我需要加载两个 DLL 文件嵌入的资源,所以我可以在没有文件的情况下使用应用程序!

     public MainWindow()
    
         AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
         AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve2);
        InitializeComponent();
    


 static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs e)
    
        using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("DS.WpfAnimatedGif.dll"))
        
            byte[] assemblyData = new byte[stream.Length];
            stream.Read(assemblyData, 0, assemblyData.Length);
            return Assembly.Load(assemblyData);
        
    

    static System.Reflection.Assembly CurrentDomain_AssemblyResolve2(object sender, ResolveEventArgs e)
    
        using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("DS.Newtonsoft.Json.dll"))
        
            byte[] assemblyData = new byte[stream.Length];
            stream.Read(assemblyData, 0, assemblyData.Length);
            return Assembly.Load(assemblyData);
        
    

【问题讨论】:

【参考方案1】:

一旦您从第一个事件处理程序返回,下一个事件处理程序将被忽略。

这是as per the documentation here:

如果为此事件注册了多个事件处理程序,则按顺序调用事件处理程序,直到事件处理程序返回一个非空值。后续事件处理程序将被忽略。

【讨论】:

不明白,我需要在我的程序中加载2个dll文件,我该怎么做?!

以上是关于使用 AppDomain 将 DLL 作为嵌入式资源文件加载的主要内容,如果未能解决你的问题,请参考以下文章

消息泵和 AppDomain

将 DLL 加载到单独的 AppDomain

如何将带有 dll 的应用程序从内存加载到 AppDomain 中并执行它?

将 DLL 加载到具有已知唯一公共接口的单独 AppDomain 中

将程序集加载到子 AppDomain 并释放 dll 文件

C# AppDomain 无法加载 DLL