我正在创建一些插件dll,用于在启动时验证我的网站配置。我想将这些dll放在/ bin文件夹的子目录中。所以我把它添加到我的web.config文件中:
<runtime>
<assemblyBinding appliesTo="v2.0.50727" xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin/plugins" />
...
</runtime>
然后我有一个项目,可以在/ bin / plugins目录中构建和部署一些dll。
我已经验证构建步骤是正确的,并创建子文件夹并将dll放在那里。
然后在application_start上,我尝试加载程序集。我得到当前正在执行的程序集路径:
Dim assembly As Assembly = System.Reflection.Assembly.GetExecutingAssembly()
Dim asmDirectory As String = Path.GetDirectoryName(assembly.Location)
Dim pluginDirectory As String = Path.Combine(asmDirectory, "plugins")
pluginDirectory通常设置为这样:
"C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\91be3168\7a998462\assembly\dl3\33ada1a0\6561a9fc_a4dacd01"
但在该目录中,没有插件目录。
如何将IIS(我的情况下为IIS 6.0)复制到我的代码目录中的子文件夹和内容到执行位置?
如果VB.NET难以阅读,我很乐意翻译成C#。
答案 0 :(得分:4)
复制程序集的行为称为Shadow Copying。为了启用它,ASP.NET调用AppDomain.SetShadowCopyPath(它是一个过时的API,但它仍然是它所调用的),只将路径传递给bin文件夹。
这就是为什么你没有看到子文件夹中的程序集被复制阴影。该行为是不可配置的。此外,即使它是,它也不会按你想要的方式工作,因为它不会重新创建与bin中相同的结构。
您可以只调用HttpRuntime.BinDirectory,而不是依赖于正在执行的程序集路径,这将为您提供bin的路径,您可以在其中附加插件文件夹。