我已经看到了这个和这个问题,但它们都有几年的历史了,就我而言,可能还有另一种解决方案:
我有一个带有基于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
所描述的那样,我现在要解决我的实际问题:
我正在寻找一个更好的解决方案来避免被贬低的方法。
我想到了以下解决方案,但无法确定是否/如何可能:
AppDomain
配置 IIS以创建一个AppDomainSetup.ShadowCopyDirectories
属性设置为~/bin
和~/Plugins/ShadowCopy
viaweb.config
- 将卷影复制目录移动到 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
,但是“干扰框架文件夹”是否明智?
我对解决这个问题以及解决我的基本问题的不同方法持开放态度。