如何在 AppDomain 下创建类的新实例

Posted

技术标签:

【中文标题】如何在 AppDomain 下创建类的新实例【英文标题】:How to Create a new instance of class under an AppDomain 【发布时间】:2013-07-26 18:25:23 【问题描述】:

我正在尝试调用一个类以在单独的 AppDomain 下运行,但我收到一个异常,指出能够加载该类或其依赖项之一。这是我正在做的一个例子。

AppDomain ad = AppDomain.CreateDomain("New domain");
IIdentity identity = new GenericIdentity("NewUser");
IPrincipal principal = new GenericPrincipal(identity, null);
ad.SetThreadPrincipal(principal);
TestClass remoteWorker = (TestClass)ad.CreateInstanceAndUnwrap(
                         binFolder+"\\TestProject.dll",
                         "TestClass");
remoteWorker.Run(data1,data2);

在我单独的 TestProject 中,我有一个名为 TestClass 的类:

 public class TestClass : MarshalByRefObject
 
      public void Run(string name, string path)
      
           //Some stuff
      
  

我已经检查了所有路径,它们都是正确的。我收到错误消息:

Could not load file or assembly 'K:\\Installer\\Bin\\TestProject.dll' 
or one of its dependencies. The given assembly name or codebase was invalid. 
(Exception from HRESULT: 0x80131047)

我已尝试更改路径,将其移至当前正在执行的程序集。依然没有。 DLL 位于 K:\Installer\Bin\TestProject.dll 中。我在管理员下运行它,因此它具有对 Dll 的权限。

【问题讨论】:

您是否尝试捕获ReflectionTypeLoadException 异常?也许“TestProject.dll”有一些运行时无法解析的依赖项。 包含的唯一内容是系统 Dll。那些不解决怎么办? 【参考方案1】:

想通了。将我的代码更改为:

AppDomainSetup domainSetup = new AppDomainSetup 
                             PrivateBinPath = binFolder+"\\TestProject.dll";
AppDomain ad = AppDomain.CreateDomain("New domain",null, domainSetup);

TestClass remoteWorker = (TestClass)ad.CreateInstanceFromAndUnwrap(
                          binFolder+"\\TestProject.dll",
                          typeof(TestClass ).FullName);

【讨论】:

以上是关于如何在 AppDomain 下创建类的新实例的主要内容,如果未能解决你的问题,请参考以下文章

如何防止其他人在堆栈上创建您的类的新实例?

如何创建自定义元素扩展类的新实例

PHP基于父类的现有实例创建子类的新实例

malloc 是不是创建类的新实例? [复制]

使用 Java 从类数组创建类的新实例

如何将构造函数参数传递给 AppDomain.CreateInstanceXXX?