AppDomain创建:解决“无法加载文件或程序集”错误

时间:2011-02-04 12:24:55

标签: c# .net

这很奇怪。这是代码:

 AppDomain newDomain = AppDomain.CreateDomain("newDomain ", null,
            new AppDomainSetup
            {
                ApplicationBase = @"D:\myDLLFolderFullPath\"
            });

 Assembly a = newDomain.Load("myAssembly");

这会抛出“无法加载文件或程序集”错误 我检查了我的Assembly的dll位于指定的文件夹路径下,并且汇编的名称是正确的。

当我将myAssembly.dll复制到CurrentDomain的主文件夹时,它可以正常工作! 它的行为就好像新AppDomain的ApplicationBase设置完全没有效果并继续指向当前AppDomain的AppBase。

任何想法?

3 个答案:

答案 0 :(得分:1)

我不确定.NET是否允许从与主可执行路径无关的路径加载程序集。

所以,我认为这是不允许的:

 D:\myExeFolderFullPath\main.exe
 D:\myDLLFolderFullPath\Mydll.dll

......虽然这应该有效:

 D:\myExeFolderFullPath\main.exe
 D:\myExeFolderFullPath\myDLLFolderFullPath\Mydll.dll

<强>更新

在处理mygeneration项目时,我遇到了类似的路径问题。我发现让它运行的唯一方法是重新组织我在这个答案中描述的文件夹结构。

答案 1 :(得分:0)

我不知道你想要做什么......

但要将dll加载到AppDomain并创建实例,您可以这样做:

创建AppDomain。设置和安全信息是可选参数。

 var appDomain = AppDomain.CreateDomain("A friendly name to identify your application", null, null);

加载你的程序集:

   var assemblyName = AssemblyName.GetAssemblyName(@"C:\PathToYourApp\ConsoleApplication1.exe"));

在app域中创建一个实例:

var instance = (Program)appDomain.CreateInstanceAndUnwrap(assemblyName.Name, "ConsoleApplication1.Program");

重要提示:您要在应用领域之外解包和访问的课程必须使用[Serializable] Attrbute进行标记!

[Serializable]
class Program{}

使用事件appDomain.UnhandledException进行AppDomain之外的异常处理。

答案 2 :(得分:0)

请参阅msdn获取 appDomain.load()方法: *

  

此方法仅用于将装配加载到当前   应用领域。

  • 提供此方法是为了方便无法调用静态Assembly.Load方法的互操作性调用方。要将程序集加载到其他应用程序域,请使用 CreateInstanceAndUnwrap 等方法。 如果已加载所请求程序集的版本,则此方法将返回已加载的程序集,即使请求了不同的版本。