在独立 AppDomain 中递归加载程序集及其引用
将程序集加载到新的 AppDomain 时,务必递归加载其所有引用,以防止出现 FileNotFoundException
错误。本文将探讨完成此复杂任务的步骤。
首先,创建一个具有自定义 ApplicationBase
的独立 AppDomain。然后,使用 AssemblyName.GetAssemblyName
加载根程序集。但是,仅此一项还不够;您需要手动加载程序集的引用。
为此,使用 ReflectionOnlyLoadFrom
获取引用的程序集列表,而无需实际加载它们。对于每个引用,使用 domain.Load(refAsmName)
将其加载到 AppDomain 中。
但是,这里有一个需要注意的地方。要在外部应用程序域中执行代理对象,您需要调用 CreateInstanceAndUnwrap
。此方法确保对象在目标 AppDomain 中执行。
代码示例说明了此过程:
<code class="language-csharp">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); } } }</code>
请记住,当使用 LoadFile
而不是 LoadFrom
时,您必须自行加载任何依赖项,以避免 FileNotFound
异常。
以上是如何将程序集引用递归加载到单独的 AppDomain 中?的详细内容。更多信息请关注PHP中文网其他相关文章!