定位程序集的非特定版本

我试图不针对一个特定版本的DLL,但我不太确定如何。 我已将程序集属性上的选项特定版本设置为false,但是如果我尝试运行应用程序并且所请求的程序集的版本是前一个,我得到一个:

FileLoadException: Could not load file or assembly 

当引用的dll版本与当前版本不完全匹配时,会发生这种情况。 我认为问题在于如何引用这个程序集。

通常,如果您尝试使用特定版本的程序集,则下面并不真正适用,您应该只使用所需的版本。

但是,有时你会遇到这样的情况:

AssemblyX – 引用AssemblyZ的1.2.1版
AssemblyY – 引用AssemblyZ的1.2.2版

但是您的项目需要AssemblyX AssemblyY。

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

           

这基本上说的是,如果解决方案中的任何程序集引用了myAssembly的1.0.0.0,那么它们应该真正使用版本2.0.0.0。 并且您应该在路径中存在版本2.0.0.0。

当您总是希望它们使用特定版本的程序集时,您可以使用的hack是指定版本范围,如下所示:

      

这将强制MyAssembly的1.2.1.0版本用于0.0.0.0和3.0.0.0之间的MyAssembly的任何版本引用。

到目前为止我发现的解决这个问题的唯一方法是:

1)ILMerge dll具有依赖性我有2)提供依赖(在这种情况下是一个dll)3)不签署程序集,这将是相当困难的,因为我需要“取消签名”层次结构

您可以拥有两个dll,并可以使用bindingRedirect,如下面的链接

在dotnet中进行dll版本控制

           

虽然以下App.Config的代码示例是正确的,但您可能希望通过在assemblyBinding树中添加以下publisherPolicy apply =“no”来阻止GAC策略覆盖您的愿望,这将导致所有程序集忽略GAC发布者策略或您可以在dependentAssembly树中放置publisherPolicy apply =“no”/>,这将只传递该程序集的publisherPolicy。

  {     // This applies to the whole application - all references   // This applies only to this assembly    } 

有关详细信息,请参阅: MSDN参考