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

本文关键字:文件 加载 AppDomain 自定义 程序集 类型 不知道 情况下 | 更新日期: 2023-09-27 18:02:40

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

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

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

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

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

不要尝试在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);
}