18

有什么方法可以强制我的 asp.net 应用程序从本地 bin 目录加载程序集,因为 gac 中有另一个具有相同名称的旧版本的程序集?

我无法删除 gac 版本,因为其他应用程序正在使用它,并且在将较新版本添加到 gac 时我遇到了一些困难。

4

8 回答 8

8

我找到了

要强制您的应用程序从本地 bin 目录读取,您必须从程序集中删除签名,然后应用程序将从 bin 加载程序集。

感谢怀亚特巴内特和穆拉德。

于 2009-06-13T20:58:38.907 回答
5

更改版本号,强命名程序集并引用您使用解决方案部署的强命名的更高版本。

于 2009-06-13T19:22:26.703 回答
3

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" />

就是这样。

于 2013-07-03T01:52:09.773 回答
3

作为建议的解决方案的替代方案,在开发期间,您可以通过设置环境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"
于 2016-06-10T10:15:10.557 回答
1

要将一个版本重定向到另一个版本,请使用 <bindingRedirect> 元素。oldVersion 属性可以指定单个版本或一系列版本。例如,指定运行时应使用版本 2.0.0.0 而不是 1.1.0.0 和 1.2.0.0 之间的程序集版本。

s

于 2010-04-29T18:51:05.093 回答
1

基于此答案中关于程序集加载顺序的摘录: 如何防止 .NET 应用程序从 GAC 加载/引用程序集?

我猜想在要求库作为程序集加载之前在本地 DLL 文件上调用 LoadLibrary可能会在搜索顺序中为您向上移动它。

可悲的是,我不确定如何在框架开始加载引用的程序集之前让您的 LoadLibrary 调用运行。

所以这只是一个想法,而不是一个完整的答案。

于 2013-11-21T19:26:05.210 回答
0

您可以指定代码库路径,而不是使用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 中完成。

于 2016-04-15T05:55:51.793 回答
-1

为什么不将您喜欢的版本安装到 GAC 中,然后在 GAC 中引用它?

于 2009-07-28T07:55:50.673 回答