定位程序集的非特定版本
我试图不针对一个特定版本的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.config
或App.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参考