我的方案是我有一个创建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中的代码?
...谢谢
答案 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");