C# 在另一个AppDomain中创建类型的实例

C# 在另一个AppDomain中创建类型的实例,c#,appdomain,createinstance,C#,Appdomain,Createinstance,我的场景是,我有一个创建AppDomains的.net应用程序(比如控制台应用程序)。然后,它需要在该AppDomain中的类型上创建实例并调用方法。每个AppDomain都有一个特定的目录,它的依赖项应该在哪个目录下,而该目录不在Console Apps目录下(甚至不在其附近)。以下是我的简单代码: string baseDirectory = "c:\foo"; // <- where AppDomain's dependecies // set up the app domain

我的场景是,我有一个创建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" ); 

string baseDirectory=“c:\foo”;// 我不能说你的代码有什么问题,因为它看起来应该可以工作。然而,当我完成这项工作时,我已经找了一个助手来做这项工作。大致如下:

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

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

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

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

baseDirectory+@“\SampleClassLibrary.dll”//仅提供dll的完全限定路径就成功了,至少我能够加载该类型。AppDomain在“baseDirectory”中查找似乎很奇怪但是对于该dll。我想知道如果该dll引用了该目录中的其他dll,是否会出现问题。我将测试它并查看。正如我所想,感谢Bruce,上面的解决方案不起作用。这就像AppDomain找不到任何依赖于它的dll一样,因为它正在查找的目录是Console Apps目录列表,而不是AppDomains…有什么想法吗?这不会这么难吗?我发现使用AssemblyResolve处理程序可以解决问题。请阅读我关于跨AppDomain通信的博客,或者尝试在运行时使用AssemblyResolve解析程序集。