无法将执行程序集加载到新的AppDomain,FileNotFoundException

时间:2011-01-20 16:01:18

标签: c# appdomain

我正在尝试在新的AppDomain中托管文本模板类代理。

我有一些类似的旧脚本代码,包含这个有效的代码:

_ScriptAppDomain = AppDomain.CreateDomain(scriptDomainFriendlyName);
_ScriptProxy = (IScriptEngineProxy)_ScriptAppDomain.CreateInstanceAndUnwrap(
    Assembly.GetExecutingAssembly().FullName,
    "LVK.Scripting.ScriptEngineProxy");

但是,当我尝试使用我的新课程时,请使用以下内容

_TemplateDomain = AppDomain.CreateDomain(templateDomainFriendlyName);
_TemplateProxy = (ITemplateProxy)_TemplateDomain.CreateInstanceAndUnwrap(
    Assembly.GetExecutingAssembly().FullName,
    "TextTemplate.TemplateProxy");

我得到“FileNotFoundException”,其中包含以下详细信息:

  

无法加载文件或程序集'TextTemplate,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = bb70a2e62a722ace'或其依赖项之一。系统找不到指定的文件。

我错过了什么?

基本上,我在TextTemplate命名空间(和程序集)中有一个Template类,它试图将TemplateProxy类(从MarshalByRefObject降序)加载到新的appdomain中,但看起来我的主程序集没有加载到这个域中。 / p>

如果我使用较旧的代码,但是没有使用这个新代码,这是有效的,但我无法发现差异。

以下是更多细节:

  • 大会未在GAC注册(旧版本也没有注册)
  • 我没有覆盖任何AssemblyResolve事件(旧的事件也没有覆盖)

我不反对处理AssemblyResolve事件,如果需要的话。我发现我的旧代码工作很奇怪,但事实并非如此。

2 个答案:

答案 0 :(得分:12)

假设您的程序集与当前应用程序库位于同一目录中,请尝试指定Application Base:

        AppDomain.CreateDomain(templateDomainFriendlyName, null,
            new AppDomainSetup
            {
                ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase
            });

答案 1 :(得分:4)

如果您不知道自己在做什么,创建新域的最佳方法是从当前设置中复制所有设置,如下所示:

        var newDomain = AppDomain.CreateDomain("NAME", 
                        AppDomain.CurrentDomain.Evidence,
                        AppDomain.CurrentDomain.SetupInformation);

我有类似的问题,并为我复制解决了这些问题