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

我试图在新的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中,但看起来我的主程序集没有加载到这个域中。

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

这里有一些更多的细节:

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

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

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

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

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

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

我有类似的问题,并制作副本为我解决它们