2

我正在创建一些在启动时验证我的网站配置的插件 dll。我想将这些 dll 放在 /bin 文件夹的子目录中。所以我将它添加到我的 web.config 文件中:

<runtime>
   <assemblyBinding appliesTo="v2.0.50727" xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="bin;bin/plugins" />
      ...
</runtime>

然后我有一个项目,可以构建一些 dll 并将其部署到 /bin/plugins 目录中。

我已经验证了构建步骤是正确的,并创建了子文件夹并将 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#。

4

1 回答 1

4

在那里复制程序集的行为称为影子复制。为了启用它,ASP.NET 调用AppDomain.SetShadowCopyPath(它是一个过时的 API,但它仍然调用它),只将路径传递给 bin 文件夹。

这就是为什么您在子文件夹中看不到您的程序集被复制影子的原因。该行为是不可配置的。此外,即使是这样,它也不会按照您想要的方式工作,因为它不会重新创建与 bin 中相同的结构。

您可以调用HttpRuntime.BinDirectory ,而不是依赖执行的程序集路径,这将为您提供 bin 的路径,您可以将插件文件夹附加到该路径。

于 2012-12-19T19:02:24.747 回答