将程序集从文件加载到自定义AppDomain而不知道类型

时间:2015-07-13 18:31:39

标签: c# .net dll .net-assembly appdomain

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

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

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

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

1 个答案:

答案 0 :(得分: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);
}