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

时间:2009-07-30 11:58:42

标签: asp.net assembly-resolution

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

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

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

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

更新:无法在GAC中安装。举一个类比,这个网络服务给第三方应用程序提供了一个简化的视图,例如StarTeam中。我不能(不应该......不想......)将该文件夹中的所有二进制文件复制到bin文件夹或将其安装到GAC中

5 个答案:

答案 0 :(得分:14)

根据MSDN documentation

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

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

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

答案 1 :(得分:4)

你可以随时使用: AppDomain.CurrentDomain.AssemblyResolve Event 并致电

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

有关详细信息,请参阅link

答案 2 :(得分:0)

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

这篇文章可能有所帮助。它描述了“Best Practices for Assembly Loading。”

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

答案 3 :(得分:0)

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

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

在Global.asax Application_Start中执行此操作应该可以解决问题。

答案 4 :(得分:-1)

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