在不知道类型的情况下将程序集从文件加载到自定义 AppDomain

Posted

技术标签:

【中文标题】在不知道类型的情况下将程序集从文件加载到自定义 AppDomain【英文标题】:Load assemblies from file to custom AppDomain without knowing type 【发布时间】:2015-07-13 18:31:39 【问题描述】:

我需要在单独的AppDomain 中加载几个.dll 文件,对它们进行一些操作并卸载AppDomain。我可以通过CreateInstanseFrom 做到这一点,但我需要知道类型的名称。

如果我得到给定程序集中的所有类型,我可以过滤掉我的。

我可以通过reflection获取所有类型,但这仅适用于当前的AppDomain,对吗?在当前域中先加载文件是没有用的,获取类型并将它们加载到自定义域中。

是否有将程序集从文件加载到自定义应用程序域的方法?

【问题讨论】:

我已经放弃了我的答案,因为我现在没有时间帮助你找到最好的方法......对不起。 【参考方案1】:

不要尝试在 CreateInstanceFrom/CreateInstanceFromAndUnwrap 调用中使用来自某个目标程序集的类,而是使用您自己的类。您可以在 appdomain 中创建该众所周知的类并调用众所周知的方法。在那个众所周知的方法中,处理程序集。

// This class will be created inside your temporary appdomain.
class MyClass : MarshalByRefObject

    // This call will be executed inside your temporary appdomain.
    void ProcessAssemblies(string[] assemblyPaths)
    
        // the assemblies are processed here
        foreach (var assemblyPath in assemblyPaths)
        
            var asm = Assembly.LoadFrom(assemblyPath);
            ...
        
    

并像这样使用它来处理程序集:

string[] assembliesToProcess = ...;

// create the temporary appdomain
var appDomain = AppDomain.CreateDomain(...);
try

    // create a MyClass instance within the temporary appdomain
    var o = (MyClass) appDomain.CreateInstanceFromAndUnwrap(
        typeof(MyClass).Assembly.Location,
        typeof(MyClass).FullName);

    // call into the temporary appdomain to process the assemblies
    o.ProcessAssemblies(assembliesToProcess);

finally

    // unload the temporary appdomain
    AppDomain.Unload(appDomain);

【讨论】:

加载我的程序集时,我得到一个无法加载文件或程序集“...”或其依赖项之一。该系统找不到指定的文件。我们谈论的是我添加的 shell32 和 wmplib 之类的 dll,但它们不是 .net 程序集。由于我的程序集依赖于它们,有没有办法可以加载“不安全”的程序集? UnsafeLoadFrom 不起作用。 .dll 不一定是程序集,程序集也不一定是 .dll。您正在尝试使用托管进程中的非托管 .dll。在我提供帮助之前,你必须告诉我们更多关于你想要完成的事情。但是,LoadLibrary 是用于加载 .dll 的 Win32 API。阅读文档可能会有所帮助。

以上是关于在不知道类型的情况下将程序集从文件加载到自定义 AppDomain的主要内容,如果未能解决你的问题,请参考以下文章

如何在不先定义表中的列的情况下将数据加载到 PostgreSQL 中?

如何在不创建架构的情况下将 CSV 文件加载到 BigQuery

有没有办法在不将完整文件加载到内存的情况下将 tiff 图像转换为 Base64

如何在不先加载到 RAM 的情况下将文件加载到 blob 中?

在不知道数据类型的情况下将值绑定到 PreparedStatement

在不知道编码类型的情况下将 NSData 转换为 NSString