如何以所有引用递归地将程序集加载到AppDomain?
我想加载到AppDomain
具有复杂引用树的新程序集(MyDll.dll-> Microsoft.Office.Interop.Excel.dll->
Microsoft.Vbe.Interop.dll-> Office.dll-> stdole.dll)
据我了解,将程序集加载到时AppDomain
,其引用不会自动加载,而我必须手动加载它们。因此,当我这样做时:
string dir = @"SomePath"; // different from AppDomain.CurrentDomain.BaseDirectorystring path = System.IO.Path.Combine(dir, "MyDll.dll");
AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
setup.ApplicationBase = dir;
AppDomain domain = AppDomain.CreateDomain("SomeAppDomain", null, setup);
domain.Load(AssemblyName.GetAssemblyName(path));
并得到FileNotFoundException
:
无法加载文件或程序集’MyDll,版本= 1.0.0.0,文化=中性,PublicKeyToken =空’或其依赖项之一。该系统找不到指定的文件。
我认为关键部分是 。
好吧,我之前要做 domain.Load(AssemblyName.GetAssemblyName(path));
foreach (AssemblyName refAsmName in Assembly.ReflectionOnlyLoadFrom(path).GetReferencedAssemblies()){
domain.Load(refAsmName);
}
但是FileNotFoundException
再次出现在另一个(引用的)程序集上。
如何递归加载所有引用?
加载根程序集之前是否必须创建引用树?如何在不加载程序集的情况下获取其引用?
回答:
您需要先调用,CreateInstanceAndUnwrap
然后代理对象才能在外部应用程序域中执行。
class Program{
static void Main(string[] args)
{
AppDomainSetup domaininfo = new AppDomainSetup();
domaininfo.ApplicationBase = System.Environment.CurrentDirectory;
Evidence adevidence = AppDomain.CurrentDomain.Evidence;
AppDomain domain = AppDomain.CreateDomain("MyDomain", adevidence, domaininfo);
Type type = typeof(Proxy);
var value = (Proxy)domain.CreateInstanceAndUnwrap(
type.Assembly.FullName,
type.FullName);
var assembly = value.GetAssembly(args[0]);
// AppDomain.Unload(domain);
}
}
public class Proxy : MarshalByRefObject
{
public Assembly GetAssembly(string assemblyPath)
{
try
{
return Assembly.LoadFile(assemblyPath);
}
catch (Exception)
{
return null;
// throw new InvalidOperationException(ex);
}
}
}
另外,请注意,如果您使用它,则LoadFrom
可能会遇到FileNotFound
异常,因为程序集解析器将尝试在GAC或当前应用程序的bin文件夹中查找要加载的程序集。LoadFile
而是使用加载任意程序集文件-
但请注意,如果执行此操作,则需要自己加载所有依赖项。
以上是 如何以所有引用递归地将程序集加载到AppDomain? 的全部内容, 来源链接: utcz.com/qa/411236.html