强制ASP.NET应用程序从bin而不是从GAC加载程序集

时间:2009-06-13 19:05:59

标签: asp.net binary gac

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

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

8 个答案:

答案 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中引用它?

相关问题