3

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

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 中的代码?

谢谢...

4

2 回答 2

3

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

ObjectHandle handle = domain.CreateInstanceFrom( 
    baseDirectory + @"\SampleClassLibrary.dll", // <- exists in "c:\foo"  
    "SomeClassInTheDll" );
于 2010-01-16T01:33:01.213 回答
0

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

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

Loader l = (Loader)domain.CreateInstanceAndUnwrap("Loader");
l.Load("SomeClassInTheDll");
于 2010-01-16T01:20:48.600 回答