我需要在单独的AppDomain
中加载几个.dll文件,对它们执行一些操作并卸载AppDomain。我可以通过CreateInstanseFrom
来做到这一点,但我需要知道该类型的名称。
如果我获得了给定程序集中的所有类型,我可以过滤掉我的。
我可以通过反射获取所有类型,但这只适用于当前的AppDomain,对吧?在当前域中首先加载文件,获取类型并将其加载到自定义域中是没有用的。
是否有方法将 程序集 从文件加载到自定义应用程序域?
答案 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);
}