我正在尝试在新的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>
如果我使用较旧的代码,但是没有使用这个新代码,这是有效的,但我无法发现差异。
以下是更多细节:
我不反对处理AssemblyResolve事件,如果需要的话。我发现我的旧代码工作很奇怪,但事实并非如此。
答案 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);
我有类似的问题,并为我复制解决了这些问题