在.net中绑定重定向问题

时间:2009-11-17 21:05:48

标签: .net binding assemblies

我有一个名为“MyAssembly”的类库,它在内部引用a.dll,版本3.1.1.0的b.dll;我已经构建了一个超出MyAssembly.dll的项目。在另一个系统(框)上,我创建了一个Web应用程序项目并引用了MyAssembly.dll。新系统有新版本的a.dll和b.dll 4.0.0;我在web.config中使用绑定重定向,如下所示。但仍然无法编译Web应用程序。它说缺少程序集引用a.dll,版本3.1.1.0。

任何机构都可以帮助解决这个问题吗?

谢谢, 苏雷什

                                                                    

4 个答案:

答案 0 :(得分:27)

这完全适合我。注意:configuration标记上需要 NO命名空间。并且必须在assemblyBinding标记上有一个名称空间

<assemblyBinding> Element for <runtime>

<!-- important: no namespace -->
<configuration> 
  <runtime>
    <!-- important, must have this namespace -->
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <dependentAssembly>
        <assemblyIdentity name="Strongly.Named.Assembly" publicKeyToken="xxx" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

做这两件事,否则就不会读它。如果它在这个例子中给出了一个错误,它无法加载除2.0.0.0以外的任何东西,那么它就不会正确地获取配置元素。

这也仅适用于强名称程序集。要查明是否有强名称,请从VC命令窗口运行以下命令

打开(开始菜单&gt;所有程序&gt; visual studio&gt; visual studio tools&gt; visual studio命令提示符)

然后运行:

sn -vf "path-to-assembly.dll"

如果它返回它是有效的,那么它被强烈命名。

源: http://blog.codingoutloud.com/2010/03/13/three-ways-to-tell-whether-an-assembly-dl-is-strong-named/

答案 1 :(得分:6)

这应该有用。

<runtime>  
 <dependentAssembly>  
   <assemblyIdentity name="MyAssembly" publicKeyToken="12233444"/>  
   <bindingRedirect oldVersion="3.1.1.0" newVersion="4.0.0.0"/>  
 </dependentAssembly>  
</runtime>  

另一个建议:从配置标记中删除命名空间:

而不是

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">

<configuration>

答案 2 :(得分:0)

您在Web应用程序中使用MyAssembly。绑定重定向将用于此程序集,而不是MyAssembly使用的程序集。检查MyAssembly.dll的清单,它应该是指3.1.1.0版本的a.dll,因此会显示编译器错误。使用引用版本4.0.0.0的a.dll构建MyAssembly,然后在Web应用程序中使用MyAssembly。这将有效。

答案 3 :(得分:0)

尝试这种方式:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="a.dll"
                      publicKeyToken="{put a.dll publicKeytoken here}"
                      culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-99.99.99.99"
                     newVersion="4.0.0.0"/>
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="b.dll"
                      publicKeyToken="{put b.dll publicKeytoken here}"
                      culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-99.99.99.99"
                     newVersion="4.0.0.0"/>
  </dependentAssembly>
</assemblyBinding>

此外,转到您的应用程序的引用,右键单击a.dll和b.dll,转到属性并检查“特定版本”是否设置为False。

希望它有所帮助。