10

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

我试图保留CopyLocal=falseWeb 服务中引用的程序集。这最终导致程序集出现 FileNotFound 异常。当我切换到CopyLocal=true时,引用的 DLL 被复制到 bin 文件夹中。它可以工作。

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

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

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

4

5 回答 5

14

根据MSDN 文档

应用程序根目录之外的引用程序集必须具有强名称,并且必须安装在全局程序集缓存中或使用<codeBase>元素指定。

所以,看起来你运气不好。这是我要尝试的:

  1. 在您的应用程序基目录下创建一个NTFS 连接点,该连接点指向包含您的共享代码的目录。这是关键的一步。例如,在您的应用程序基目录中,运行linkd SharedCode c:\NotMyCode. 这使得<yourappbase>\SharedCode有效地成为c:\NotMyCode.
  2. 告诉 ASP.NET 使用<probing>引用 junction point 的元素探测此路径中的程序集SharedCode。由于这是在您的应用程序基础下,它应该可以工作。或者,使用AppDomainSetup.PrivateBinPath设置为程序集探测的路径。

我很好奇这是否有效:-)

于 2009-07-31T09:32:00.623 回答
4

您始终可以使用: AppDomain.CurrentDomain.AssemblyResolve 事件 并调用

Assemly.Load(Path.Combine(@"c:\NotMyStuff",args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll"))

有关更多信息,请参阅链接

于 2012-04-09T16:06:42.093 回答
0

我认为您也可以在代码中引用特定的汇编路径。

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

在您的 Global.asax Application_Start 中这样做应该可以解决问题。

于 2009-07-30T12:25:19.233 回答
0

您始终可以将引用的程序集放在 GAC 中,那么位置就无关紧要了。您可以通过将组件拖入 GAC (C:\windows\assembly) 或运行 GACUtil.exe 来安装组件。

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

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

于 2009-07-30T12:06:07.137 回答
-1

您可以放入 GAC 并从那里访问它。

于 2009-07-30T12:16:25.333 回答