有什么方法可以强制我的 asp.net 应用程序从本地 bin 目录加载程序集,因为 gac 中有另一个具有相同名称的旧版本的程序集?
我无法删除 gac 版本,因为其他应用程序正在使用它,并且在将较新版本添加到 gac 时我遇到了一些困难。
我找到了
要强制您的应用程序从本地 bin 目录读取,您必须从程序集中删除签名,然后应用程序将从 bin 加载程序集。
感谢怀亚特巴内特和穆拉德。
更改版本号,强命名程序集并引用您使用解决方案部署的强命名的更高版本。
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" />
就是这样。
作为建议的解决方案的替代方案,在开发期间,您可以通过设置环境DEVPATH
变量并在. 我认为这是迄今为止实现您想要的最简单的方法,但不应该在生产中使用。machine.config
这解决了您的程序集版本与 GAC 中的版本相同的问题,如果版本不同,您应该使用bindingRedirect
多个用户在此处提到的方法。
首先,将以下内容添加到machine.config
:
<configuration>
<runtime>
<developmentMode developerInstallation="true"/>
</runtime>
</configuration>
然后,将DEVPATH
环境变量设置为未签名程序集的位置。这将强制 Fusion 的 DEVOVERRIDE 模式在DEVPATH
探测 GAC 之前启动并搜索(及其子目录)。
MSDN 上DEVPATH
的一个常见问题解答DEVOVERRIDE
将回答大多数关于使用它的效果的问题。
Fusion(.NET 的程序集加载器)将仅按名称和版本进行搜索,它将把强命名的程序集等同于其他程序集,在搜索之前不会搜索 GAC DEVPATH
,并且只返回找到的第一个匹配项。您应该使用Fusion Log Viewer (fuslogvw)来查看您是否正确启用了它,如DEVPATH
.
刚开始使用 FusLogVw?Scott Hanselman 写了一篇出色的介绍。Viewer 的界面相当陈旧,需要一点时间来适应。
请注意,Fusion Log Viewer(或Assembly Binding Log Viewer,名称中的含义)会混淆地表示您使用了DEVOVERRIDE
环境变量。它应该看起来像这样:
LOG: Found assembly in DEVOVERRIDE path D:\testassemblies\Test.DLL
注意:如果您希望 Visual Studio 从该DEVPATH
位置加载程序集,您应该为该位置设置一个注册表项,即设置(检查 .NET 版本项以匹配您的 .NET 版本):
[HKEY_CURRENT_USER\
SOFTWARE\
Microsoft\
.NETFramework\
v2.0.50727\AssemblyFoldersEx\
DEVPATH]@="C:\SharedAssemblies"
要将一个版本重定向到另一个版本,请使用 <bindingRedirect> 元素。oldVersion 属性可以指定单个版本或一系列版本。例如,指定运行时应使用版本 2.0.0.0 而不是 1.1.0.0 和 1.2.0.0 之间的程序集版本。
s
基于此答案中关于程序集加载顺序的摘录: 如何防止 .NET 应用程序从 GAC 加载/引用程序集?
我猜想在要求库作为程序集加载之前在本地 DLL 文件上调用 LoadLibrary可能会在搜索顺序中为您向上移动它。
可悲的是,我不确定如何在框架开始加载引用的程序集之前让您的 LoadLibrary 调用运行。
所以这只是一个想法,而不是一个完整的答案。
您可以指定代码库路径,而不是使用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 中完成。
为什么不将您喜欢的版本安装到 GAC 中,然后在 GAC 中引用它?