Forcing the ASP.NET Application to load the assemb

2019-01-23 14:10发布

Is there any way to force my asp.net application to load the assembly from local bin directory since there is another older version of the assembly with the same name in the gac?

I can't delete the gac version since other applications are using it and I am facing some difficulties when adding the newer version to the gac.

8条回答
forever°为你锁心
2楼-- · 2019-01-23 14:22

Instead of using bindingRedirect, you can specify the codebase path. I have a working example with MySQL.Data.dll.

<dependentAssembly>
    <assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
    <codebase version="5.2.5.0" href="/bin/MySQL.Data.dll" />        
  </dependentAssembly>

This can be done in Web.config of the web application.

查看更多
Juvenile、少年°
3楼-- · 2019-01-23 14:24

The oldVersion configuration that is suggested by Muse VSExtensions works! You can use the strong name for the local assembly: Please look this page: http://msdn.microsoft.com/en-us/library/7wd6ex19.aspx

Basically in web.config add something like:

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

That way if i have an assembly in the gac that can be from version 2.0.0.0 to version 2.5.0.0 all the calls would be redirected to the newVersion (3.0.0.0)

In the assemblies section I added the assembly:

<add assembly="DllName, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0123456789abc" />

And that's it.

查看更多
闹够了就滚
4楼-- · 2019-01-23 14:29

As an alternative to the proposed solution, during development you can bind to whatever assembly you want overriding the GAC completely by setting the DEVPATH environment variable and enabling Development Mode in the machine.config. I think this is by far the easiest way to achieve what you want, but should not be used in production.

This solves the issue where version of your assembly and the one in the GAC are the same, if versions are different, you should use the bindingRedirect approach mentioned here by several users.

First, add the following to machine.config:

<configuration>
  <runtime>
    <developmentMode developerInstallation="true"/>
  </runtime>
</configuration>

Then, set the DEVPATH environment variable to the location of your non-signed assemblies. This will force Fusion's DEVOVERRIDE mode to kick in and search the DEVPATH (and its subdirectories) prior to probing the GAC.

An FAQ of DEVPATH and DEVOVERRIDE on MSDN will answer most questions on the effects of using this.

Fusion (.NET's assembly loader) will search by name and version only, it will treat strongly named assemblies equal to other assemblies, won't search the GAC before searching DEVPATH, and simply returns the first match found. You should use the Fusion Log Viewer (fuslogvw) to see that you properly enabled it, as explained in this blog post on DEVPATH.

New to using FusLogVw? Scott Hanselman wrote an excellent intro. The interface of the Viewer is rather archaïc and takes a little getting used to.

Note that the Fusion Log Viewer (or Assembly Binding Log Viewer, what's in a name) will confusingly say that you used the DEVOVERRIDE environment variable. It should look something like this:

LOG: Found assembly in DEVOVERRIDE path D:\testassemblies\Test.DLL

NOTE: if you want Visual Studio to load the assemblies from the DEVPATH location, you should set a registry key to this location, i.e., set (check the .NET version key to match your .NET version):

[HKEY_CURRENT_USER\
    SOFTWARE\
    Microsoft\
    .NETFramework\
    v2.0.50727\AssemblyFoldersEx\
    DEVPATH]@="C:\SharedAssemblies"
查看更多
我欲成王,谁敢阻挡
5楼-- · 2019-01-23 14:32

I found it

To force your application to read from local bin directory you have to remove signing from your assembly and then the application will load the assembly from bin.

Thanks Wyatt Barnett and murad.

查看更多
我欲成王,谁敢阻挡
6楼-- · 2019-01-23 14:32

Change the version number, strong name the assembly and reference the strongly named higher version you deploy with your solution.

查看更多
孤傲高冷的网名
7楼-- · 2019-01-23 14:43

Why not install the version that you like into the GAC and then reference it in the GAC?

查看更多
登录 后发表回答