在不知道类型的情况下,将程序集从文件加载到自定义AppDomain
本文关键字:文件 加载 AppDomain 自定义 程序集 类型 不知道 情况下 | 更新日期: 2023-09-27 18:02:40
我需要在一个单独的AppDomain
中加载几个.dll文件,用它们做一些操作并卸载AppDomain。我可以通过CreateInstanseFrom
做到这一点,但我需要知道类型的名称。
如果我得到给定程序集中的所有类型,我可以过滤掉我的类型。
我可以通过反射获得所有类型,但这只适用于当前的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);
}