有没有办法强制我的asp.net应用程序从本地bin目录加载程序集,因为gac中有另一个具有相同名称的旧程序集?
我无法删除gac版本,因为其他应用程序正在使用它,我在将新版本添加到gac时遇到一些困难。
答案 0 :(得分:8)
我找到了
要强制您的应用程序从本地bin目录中读取,您必须从程序集中删除签名,然后应用程序将从bin加载程序集。
感谢Wyatt Barnett和murad。
答案 1 :(得分:5)
更改版本号,强化程序集的名称,并引用您使用解决方案部署的强名称更高版本。
答案 2 :(得分:2)
Muse VSExtensions建议的oldVersion配置有效!您可以使用本地程序集的强名称: 请看这个页面: http://msdn.microsoft.com/en-us/library/7wd6ex19.aspx
基本上在web.config中添加如下内容:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="DllName"
publicKeyToken="0123456789abc"
culture="neutral" />
<!-- Assembly versions can be redirected in app,
publisher policy, or machine configuration files. -->
<bindingRedirect oldVersion="2.0.0.0-2.5.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
那样如果我在gac中有一个可以从版本2.0.0.0到版本2.5.0.0的程序集,所有的调用都会被重定向到newVersion(3.0.0.0)
在程序集部分,我添加了程序集:
<add assembly="DllName, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0123456789abc" />
就是这样。
答案 3 :(得分:2)
作为建议解决方案的替代方案,在开发期间,您可以通过在machine.config
中设置DEVPATH
environment variable并启用Development Mode来绑定到您想要完全覆盖GAC的任何程序集。我认为这是迄今为止实现您想要的最简单的方法,但不应该用于生产。
这解决了程序集版本与GAC版本相同的问题,如果版本不同,则应使用多个用户在此处提到的bindingRedirect
方法。
首先,将以下内容添加到machine.config
:
<configuration>
<runtime>
<developmentMode developerInstallation="true"/>
</runtime>
</configuration>
然后,将DEVPATH
环境变量设置为未签名程序集的位置。这将迫使Fusion的DEVOVERRIDE模式在探测GAC之前启动并搜索DEVPATH
(及其子目录)。
An FAQ of DEVPATH
and DEVOVERRIDE
on MSDN将回答有关使用此问题的影响的大多数问题。
Fusion(.NET的程序集加载器)将仅按名称和版本进行搜索,它将处理与其他程序集相同的强名称程序集,在搜索DEVPATH
之前不会搜索GAC,只返回找到的第一个匹配项。您应该使用Fusion Log Viewer (fuslogvw)来确定您是否已正确启用它,as explained in this blog post on DEVPATH
。
使用FusLogVw的新手? Scott Hanselman wrote an excellent intro。 Viewer的界面相当古老,需要一点时间习惯。
请注意,Fusion Log Viewer(或程序集绑定日志查看器,名称中的内容)会令人困惑地说您使用了DEVOVERRIDE
环境变量。看起来应该是这样的:
LOG: Found assembly in DEVOVERRIDE path D:\testassemblies\Test.DLL
注意:如果您希望Visual Studio从DEVPATH
位置加载程序集,则should set a registry key to this location,即设置(检查.NET版本密钥以匹配您的.NET版本):
[HKEY_CURRENT_USER\
SOFTWARE\
Microsoft\
.NETFramework\
v2.0.50727\AssemblyFoldersEx\
DEVPATH]@="C:\SharedAssemblies"
答案 4 :(得分:1)
根据此答案中有关装配装载顺序的摘录说明: How to prevent a .NET application from loading/referencing an assembly from the GAC?
我猜测在要求库作为程序集加载之前调用本地DLL文件上的LoadLibrary,可能按搜索顺序将其移动。
可悲的是,我不确定如何在框架开始加载引用的程序集之前运行LoadLibrary调用。
所以这只是一个想法,而不是一个完整的答案。
答案 5 :(得分:0)
要将一个版本重定向到另一个版本,请使用&lt; bindingRedirect&gt;元件。 oldVersion属性可以指定单个版本或一系列版本。例如,指定运行时应使用版本2.0.0.0而不是1.1.0.0和1.2.0.0之间的程序集版本。
取值
答案 6 :(得分:0)
您可以指定 codebase 路径,而不是使用 bindingRedirect 。我有一个MySQL.Data.dll的工作示例。
<dependentAssembly>
<assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
<codebase version="5.2.5.0" href="/bin/MySQL.Data.dll" />
</dependentAssembly>
这可以在Web应用程序的Web.config中完成。
答案 7 :(得分:-1)
为什么不将您喜欢的版本安装到GAC中,然后在GAC中引用它?