Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法将正在执行的程序集加载到新的AppDomain,FileNotFoundException_C#_Appdomain - Fatal编程技术网

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

C# 无法将正在执行的程序集加载到新的AppDomain,FileNotFoundException,c#,appdomain,C#,Appdomain,我正在尝试在新的AppDomain中托管一个文本模板类代理 我有一些执行类似操作的旧脚本代码,其中包含以下工作代码: _ScriptAppDomain = AppDomain.CreateDomain(scriptDomainFriendlyName); _ScriptProxy = (IScriptEngineProxy)_ScriptAppDomain.CreateInstanceAndUnwrap( Assembly.GetExecutingAssembly().FullName,

我正在尝试在新的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,Culture=neutral,PublicKeyToken=bb70a2e62a722ace”或其依赖项之一。系统找不到指定的文件

我错过了什么

基本上,我在TextTemplate命名空间(和程序集)中有一个模板类,它试图将TemplateProxy类(从MarshalByRefObject降序)加载到新的appdomain中,但我的主程序集似乎没有加载到此域中

如果我使用旧的代码,这是可行的,但新的代码不行,但我看不出有什么不同

以下是一些更详细的信息:

  • 装配未在GAC注册(旧的装配也未注册,它可以正常工作)
  • 我没有覆盖任何AssemblyResolve事件(旧事件也没有覆盖,它可以正常工作)

如果需要的话,我并不反对处理AssemblyResolve事件。我只是觉得我的旧代码工作起来很奇怪,而这却不行。

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

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

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

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

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

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

我也遇到过类似的问题,制作一个副本可以帮我解决这些问题

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

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

我也有类似的问题,制作一个副本可以帮我解决这些问题

您是否添加了用于程序集解析的代码?也许这可以帮助您获得更多详细信息。TextTemplate程序集是否已部署到GAC?@Sam,不,不是,但旧程序集也不是。@LexRema,不,我没有,旧程序集中也没有。是否需要重写AppDomain.AssemblyResolve事件?我认为异常消息中的关键点是“或其依赖项之一”。是否可以检查TextTemplate程序集依赖项的可用性?是否添加了用于程序集解析的代码?也许这可以帮助您获得更多详细信息。TextTemplate程序集是否已部署到GAC?@Sam,不,不是,但旧程序集也不是。@LexRema,不,我没有,旧程序集中也没有。是否需要重写AppDomain.AssemblyResolve事件?我认为异常消息中的关键点是“或其依赖项之一”。你能检查一下TextTemplate程序集的依赖项的可用性吗?好的,有了它,这部分代码运行起来没有问题,但现在我在编译我的模板的代码中得到了“编译器可执行文件csc.exe找不到”。我试着把所有的东西都简化成一个小程序,但这很管用,所以我会试着把它扩展回去看看问题出在哪里。这确实是个问题,编译器错误是完全不同的。好吧,有了它,那部分代码运行起来没有问题,但现在我得到了“编译器可执行文件csc.exe找不到”在编译我的模板的代码中。我试着把所有的东西都简化成一个小程序,但这很管用,所以我会试着把它扩展回去看看问题出在哪里。这确实是问题所在,编译器错误是完全不同的。