2010-07-19 78 views
3

我试图不针对特定版本的DLL,但我不太确定如何。 我已经设置的组件,以虚假的属性选择特定的版本,但是如果我尝试运行应用程序和要求集的版本是以前的一个,我得到一个:程序集的目标非特定版本

FileLoadException: Could not load file or assembly 

这是当引用的dll的版本与当前版本不完全匹配时会发生。 我相信问题在于如何引用这个程序集。

+0

,大会强命名? – 2010-07-19 23:18:53

+0

是它的强命名(是否有解决方法?) – roundcrisis 2010-07-20 06:41:03

+1

强命名程序集的目的是,您不能针对另一个版本进行更改。因此,使用新版本的程序集重新构建您的应用程序。如果您需要频繁更换部件,则应考虑使用[MEF](http://mef.codeplex.com/)。 – Oliver 2010-07-20 07:50:26

回答

2

一般来说,如果你想使用程序集的特定版本,下面并没有真正适用,你应该只是使用你需要的版本。

不过,有时你可以运行到哪里,你有这样的情况:

AssemblyX - 引用版本AssemblyZ
AssemblyY的1.2.1 - 引用版本AssemblyZ
1.2.2

但你项目需要AssemblyX AssemblyY。

那么你如何解决这个问题呢?您可以将AssemblyZ的1.2.1和1.2.2放在GAC中,或者如果您确定没有任何兼容性问题,则可以使用装配重新绑定。下面是一个例子(这正好在你的Web.configApp.config文件):

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
      <assemblyIdentity name="myAssembly" 
           publicKeyToken="32ab4ba45e0a69a1" 
           culture="neutral" /> 
      <bindingRedirect oldVersion="1.0.0.0" 
          newVersion="2.0.0.0"/> 
     </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

什么这基本上说的是,如果在MyAssembly程序的解决方案参考1.0.0.0任何组件,那么他们真的应该使用版本2.0.0.0。并且您希望路径中有2.0.0.0版本。

一个黑客可以使用,当你总是希望他们使用的组件的特定版本指定一个版本范围,就像这样:

 <dependentAssembly> 
      <assemblyIdentity name="MyAssembly" publicKeyToken="B7567367622062C6" culture="neutral" /> 
      <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="1.2.1.0" /> 
     </dependentAssembly> 

这将迫使MyAssembly程序的1.2.1.0版本要用于0.0.0.0和3.0.0.0之间的MyAssembly的任何版本引用。

+1

这并不具体解决我有的问题,但我认为它可能在某些情况下,所以我会把它作为答案 – roundcrisis 2010-08-12 15:27:09

+0

如何指定** AssemblyX **引用** AssemblyZ **的一个版本?我可以将** AssemblyX.dll.config **添加到我的安装文件夹并自定义已编译的应用程序的引用吗? – 2016-09-19 10:03:17

+0

@Mehrdad Mirreza - 配置文件需要将您的exe文件的名称与.config后缀匹配。所以如果你的exe是MyProgram.exe,那么配置文件需要被称为MyProgram.exe.config。至于添加一个程序集绑定到一个已编译的应用程序,你可以尝试,但是,大多数时候你将无法编译开始,因为它无法找到正确的程序集版本。所以最好的办法可能是重新编译你想要的目标程序集的版本。 – dcp 2016-09-19 15:55:46

0

解决这个问题,我迄今发现的唯一途径是:

1)ILMerge与依赖的DLL我有 2)提供的依赖关系(在这种情况下,一个dll) 3)不signong的大会,这将是非常困难的,因为我需要“签署”层次

0

可以兼得的dll并且可以使用bindingRedirect如下链接

dll versioning in dotnet

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
      <assemblyIdentity name="AssemblyName" 
           publicKeyToken="32ab4ba45e0a69a1" 
           culture="neutral" /> 
      <bindingRedirect oldVersion="1.0.0.0" 
          newVersion="2.0.0.0"/> 
     </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 
0

虽然低于App.Config中的代码示例是正确的,你可能希望保持GAC政策从覆盖您的通过在assemblyBinding树中添加以下publisherPolicy apply =“no”(这会导致所有程序集忽略GAC发布者策略),或者您可以将publisherPolicy apply =“no”/>放置在dependentAssembly树中,并且这将通过publisherPolicy仅适用于该装配。

{ <configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <publisherPolicy apply="no" /> // This applies to the whole application - all references 
     <dependentAssembly> 
     <publisherPolicy apply="no" /> // This applies only to this assembly 
      <assemblyIdentity name="AssemblyName" 
           publicKeyToken="32ab4ba45e0a69a1" 
           culture="neutral" /> 
      <bindingRedirect oldVersion="1.0.0.0" 
          newVersion="2.0.0.0"/> 
     </dependentAssembly> 
     </assemblyBinding>} 

欲了解更多信息,请参阅:MSDN reference

相关问题