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

Posted

技术标签:

【中文标题】如何将带有 dll 的应用程序从内存加载到 AppDomain 中并执行它?【英文标题】:How do I load an application with dlls from memory into an AppDomain and execute it? 【发布时间】:2010-08-06 19:06:14 【问题描述】:

我有几个流,其中包含一个程序集及其使用的 dll。如何将它们加载到 AppDomain 并执行主程序集?如果可以避免,我宁愿不将文件保存到磁盘。

【问题讨论】:

【参考方案1】:

您可以通过以下机制获取程序集。

Assembly myAssembly = Assembly.Load(<your raw file stream>);

您可以注册以下事件并对其进行处理以服务来自您的自定义程序集的请求类型:

AppDomain.CurrentDomain.TypeResolve += new ResolveEventHandler(CurrentDomain_TypeResolve);

static Assembly CurrentDomain_TypeResolve(object sender, ResolveEventArgs args)
    
        Type  resolvedType =  myAssembly.GetType( args.Name, false);
    

不幸的是,在您的程序中加载的任何类型都会在这里结束,因此您可能需要构建一些缓存机制来存储类型信息

【讨论】:

我刚试过,但它没有调用处理程序。相反,当我调用已加载和实例化的主程序集的 main 方法时,它会崩溃。 (TargetInvocationException:IOException:找不到资源'mainwindow.xaml'。)当我直接加载应用程序时,它运行良好。 如果您的程序集具有嵌入式资源,这将不起作用,因为在上面的代码中只完成了类型解析。如果您可以移动这些资源,它应该可以正常工作。或者您可以使用 Assembly.GetManifestResourceInfo 分别从该程序集中获取资源 我在我的代码中添加了资源解析,但处理程序只在加载程序程序集中调用资源。此外,程序集资源中似乎缺少异常中的 xaml 文件。 (我使用 GetManifestResourceNames() 来列出资源。)

以上是关于如何将带有 dll 的应用程序从内存加载到 AppDomain 中并执行它?的主要内容,如果未能解决你的问题,请参考以下文章

带有 .NET 的 C++ dll:内存泄漏是确定的吗?

如何查找加载到进程中的DLL及其位置等

如何将 dll 配置文件添加到添加 dll 作为参考的项目中?

优化 App 的启动时间

如何从 mfc dll 加载 ActiveX dll

在 C/C++ (Win64) 中从内存中加载 64 位 DLL