我使用ASP.Net编写了一个有效的XML Web服务。现在我需要引用位于特定文件夹中的某些程序集,例如c:\NotMyCode
我不想要将该文件夹中数以万计的dll复制/复制到我的bin文件夹中。
我试图保留Web服务中引用的程序集的CopyLocal=false
。最终导致程序集的FileNotFound异常。
当我切换到CopyLocal=true
时,引用的DLL被复制到bin文件夹..它可以工作。
所以我的问题是: 如何引用不在我的bin文件夹或其下的子文件夹中的程序集?我是否需要在某处更改某些安全策略文件?我想我不是第一个想做这样事情的人......所以我假设有人已经解决了这个问题。
(我尝试在IIS ASP.net配置面板中模拟管理员用户,但这也没有用。)
更新:无法在GAC中安装。举一个类比,这个网络服务给第三方应用程序提供了一个简化的视图,例如StarTeam中。我不能(不应该......不想......)将该文件夹中的所有二进制文件复制到bin文件夹或将其安装到GAC中
答案 0 :(得分:14)
应用程序根目录之外的引用程序集必须具有强名称,并且必须安装在全局程序集缓存中或使用<codeBase>
元素指定。
所以,看起来你运气不好。这是我要尝试的:
linkd SharedCode c:\NotMyCode
。这使得<yourappbase>\SharedCode
有效地成为c:\NotMyCode
的别名。<probing>
元素探测此路径中的程序集,并引用联结点SharedCode
。由于这是在您的应用程序基础之下,它应该工作。或者,使用AppDomainSetup.PrivateBinPath设置探测程序集的路径。我很好奇看是否有效: - )
答案 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并从那里访问它。