7

我已经看到了这个这个问题,但它们都有几年的历史了,就我而言,可能还有另一种解决方案:

我有一个带有基于THIS的插件系统的 ASP.NET MVC 5 应用程序。
所以我的~/bin文件夹是由框架复制的影子,我的~/Plugins文件夹正在使用“手动影子复制”到~/Plugins/ShadowCopy应用程序预初始化,如上面链接中所述。
到目前为止,这工作得很好,因为我现在有以下情况:

我创建了一个单独的限制AppDomain来执行一些沙盒代码。
为了能够将具有在我的程序集中定义的类型的对象传递到该域,我将此域设置ApplicationBase为主域的卷影副本目录(如果您不从那里加载它们,则SerializationException在将类型/对象传递给第二个时会得到一个域,因为定义此类型的程序集是从不同位置加载的)。

现在我可以将我的“基础程序集”中定义的类型传递给第二个域。
但是,一旦我想使用插件中定义的类型,它就会失败,因为插件程序集不在默认的卷影复制目录中,而是在我的“手动卷影复制目录”中。
而且由于该目录也位于完全不同的位置,因此我无法将其添加为 a PrivateBinPath,因为它们必须位于基本路径下方。

目前我使用以下“解决方法”:

#pragma warning disable 0618
        AppDomain.CurrentDomain.SetShadowCopyPath(String.Join(";", 
           HostingEnvironment.MapPath("~/bin"), 
           HostingEnvironment.MapPath("~/Plugins/ShadowCopy")));
#pragma warning restore 0618

在预初始化方法中。这会将“手动卷影复制目录”添加到默认卷影复制目录中,并且我的插件也被框架卷影复制,我的第二个AppDomain能够加载它们并且一切都或多或少地工作。

但是正如SetShadowCopyPath所描述的那样,我现在要解决我的实际问题:
我正在寻找一个更好的解决方案来避免被贬低的方法。
我想到了以下解决方案,但无法确定是否/如何可能:

  1. AppDomain配置 IIS以创建一个AppDomainSetup.ShadowCopyDirectories属性设置为~/bin~/Plugins/ShadowCopyviaweb.config
  2. 将卷影复制目录移动到 eg~/bin/Plugins并告诉 IIS 在此文件夹中的更改上不要回收主AppDomain目录(否则应用程序会在每次请求时重新启动,因为 pre-init 方法每次都会更改其中的文件)

另一个想法是将“手动卷影复制目录”设置在默认卷影复制目录下面,而不是类似的~/Plugins/ShadowCopy东西C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\69da84c5\cd056104\Plugins,但是“干扰框架文件夹”是否明智?

我对解决这个问题以及解决我的基本问题的不同方法持开放态度。

4

0 回答 0