另一个AppDomain中的Type的CreateInstance

时间:2010-01-16 00:50:52

标签: c# appdomain createinstance

我的方案是我有一个创建AppDomains的.net应用程序(比如一个控制台应用程序)。然后,它需要在该AppDomain中的类型上创建实例和调用方法。每个AppDomain都有一个特定的目录,它应该是依赖的,它不在(甚至接近)Console Apps目录下。这是我的简单代码:

string baseDirectory = "c:\foo"; // <- where AppDomain's dependecies 

// set up the app domain
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationName = DateTime.Now.ToString("hh:MM:ss:ffff");
setup.ApplicationBase = baseDirectory;
setup.PrivateBinPath = baseDirectory;

// create app domain
AppDomain domain = AppDomain.CreateDomain(
    name,
    AppDomain.CurrentDomain.Evidence,
    setup );

// instantiate Type from an assembly in that AppDomain
ObjectHandle handle = domain.CreateInstanceFrom(
    "SampleClassLibrary.dll", // <- exists in "c:\foo" 
    "SomeClassInTheDll" ); 

对CreateInstanceFrom的调用会导致FileNotFoundExcepotion。 FusionLog显示其搜索到的目录是Console应用程序目录。它不包括从AppDomain设置的搜索文件夹 - 在“baseDirecory”变量中。

我做错了什么?是否有另一种方法来执行另一个AppDomain中的代码?

...谢谢

2 个答案:

答案 0 :(得分:3)

一种解决方法是将完整路径传递给.CreateInstanceFrom调用:

ObjectHandle handle = domain.CreateInstanceFrom( 
    baseDirectory + @"\SampleClassLibrary.dll", // <- exists in "c:\foo"  
    "SomeClassInTheDll" );

答案 1 :(得分:0)

我不能说你的代码有什么问题,因为它看起来应该有效。然而,当我做到这一点时,我已经帮助完成了这项工作。大概是这样的:

public class Loader
{
    public void Load(string typename)
    {
        // ....
    }
}

Loader l = (Loader)domain.CreateInstanceAndUnwrap("Loader");
l.Load("SomeClassInTheDll");