如何在ASP.net应用程序中引用bin文件夹之外的程序集?

10

我有一个用ASP.Net编写的XML Web服务。现在,我需要引用位于特定文件夹中(例如c:\NotMyCode)的某些程序集。
不想将该文件夹中的大量dll复制/重复到我的bin文件夹中。

我尝试为Web服务中引用的程序集保持CopyLocal=false。结果出现了FileNotFound异常。 当我切换到CopyLocal=true时,被引用的DLL会被复制到bin文件夹中...然后它可以正常工作。

所以我的问题是: 如何引用不位于我的bin文件夹或其子文件夹中的程序集?我需要更改某些安全策略文件吗?我认为我不是第一个想要做这样事情的人...所以我假设有人已经解决了这个问题。

(我尝试在IIS ASP.net配置面板中模拟管理员用户,但也没有起作用。)

更新:也不能安装到GAC中。打个比方,这个Web服务提供给第三方应用程序(例如Starteam)一个简化的视图。我不能(不应该、不想)将该文件夹中的所有二进制文件复制到bin文件夹中或将其安装到GAC中。


我遇到了相同的问题,找不到解决方法!你有成功解决吗?我正在使用 .NET 3.5。它似乎是类似于 http://support.microsoft.com/kb/812832 的一个bug。 - dtroy
5个回答

14
根据MSDN文档,应用程序根目录外的引用程序集必须具有强名称,并且必须安装在全局程序集缓存中或使用<codeBase>元素指定。因此,看起来你运气不好。这是我会尝试的方法:
  1. 在你的应用程序基本目录下创建一个NTFS联接点,它指向包含共享代码的目录。这是关键步骤。例如,在你的应用程序基本目录中,运行linkd SharedCode c:\NotMyCode。这使得<yourappbase>\SharedCode实际上是c:\NotMyCode的别名。
  2. 使用<probing>元素引用联接点SharedCode,告诉ASP.NET在此路径中探测程序集。由于这是在你的应用程序基本目录下,所以它应该可以工作。或者,使用AppDomainSetup.PrivateBinPath设置要探测程序集的路径。
我非常好奇这是否有效 :-)

+1 秘密行动的成功...不知道linkd。它设法愚弄了Windows资源管理器,但没有愚弄ASP.Net。ASP.Net将二进制文件复制到临时位置,然后从该位置执行。奇怪的是,临时位置显示这些文件-然而FusionLogVw并没有显示出解析失败的程序集条目。但服务器像往常一样响应“文件未找到”的错误信息... - Gishu
1
我们可以禁用影子复制到临时目录,但我不喜欢JUNCTION解决方案,它像是一个黑客技巧... - Brans Ds
我测试了一下,在 Web 开发服务器上探测它并不起作用 - 服务器只返回内部错误...程序集解析也无法帮助,服务器在启动过程中失败。 - Brans Ds

4

0

你可以将所需的程序集放入全局程序集缓存(GAC)中,这样它们的位置就不再重要了。你可以通过将组件拖放到GAC(C:\windows\assembly)或运行GACUtil.exe来安装该组件。

这篇文章可能会有所帮助。它描述了“程序集加载的最佳实践”。

起初我以为你可以在web.config的runtime/assemblyBinding中使用<probing privatePath="bin\debug"/>元素,但是探测只允许你指定根目录下的子目录。


0

我认为你也可以在代码中引用特定的程序集路径。

AppDomain.CurrentDomain.AppendPrivatePath("C:\\NotMyCode");

在你的 Global.asax 的 Application_Start 方法中这样做应该就可以了。


AppendPrivatePath已过时,根据MSDN:http://msdn.microsoft.com/en-us/library/system.appdomain.appendprivatepath.aspx - Vinay Sajip
那一定是在3.5版本中出现的...可惜我还停留在2.0版本。PrivateBinPath嘛...差不多差不多... - davewasthere

-1

你可以将其放入全局程序集缓存(GAC)中,并从那里访问它。


好的回答?还是最好删除它? - Kiquenet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接