共享库依赖项 - 适当的引用和向后兼容性

时间:2014-08-07 15:57:21

标签: .net asp.net-mvc dll shared-libraries

摘要

我有以下程序集分类(程序集已签名并引用特定版本限制设置为false):

C.dll  1.0
  |----A.dll  1.0
  |----B.dll  1.0

D.exe [works]
  |----A.dll  1.0   Type ->.
  |----B.dll  1.0          |
  |----C.dll  1.0          |
                           | type moved from A to B between versions
D.exe [issues?]            |
  |----A.dll  2.0          |
  |----B.dll  2.0   Type <-'
  |----C.dll  1.0

D.exe会起作用吗?

实际问题

简介

我正在编写一个程序集组件,它可以与ASP.NET MVC Web应用程序一起使用。这些应用程序可以与使用旧框架的应用程序不同,例如System.Web.Mvc.dll 2.0,最新版本,例如System.Web.Mvc.dll 5.0。

组件本身使用DataAnnotationsModelValidator类型 - 来自System.Web.Mvc.dll和ModelClientValidationRule类型 - 过去来自System.Web.Mvc.dll(2.0,3.0),然后转发到System.Web.WebPages.dll 2.0。

实施例

  • 现在,如果我的组件将使用System.Web.Mvc.dll 4.0和System.Web.WebPages.dll 2.0进行编译,然后引用在System.Web.Mvc.dll上运行的Web应用程序3.0,Web应用程序的编译将失败:

      

    错误30程序集'MyComponent,Version = 1.0.0.0,Culture = neutral,   PublicKeyToken = null'使用'System.Web.Mvc,Version = 4.0.0.0,   Culture = neutral,PublicKeyToken = 31bf3856ad364e35'哪个更高   版本比引用程序集'System.Web.Mvc,Version = 3.0.0.0,   Culture = neutral,PublicKeyToken = 31bf3856ad364e35'

  • 另一方面,如果我的组件将使用System.Web.Mvc.dll 4.0和System.Web.WebPages.dll 2.0进行编译,然后引用在System.Web.Mvc上运行的Web应用程序.dll 5.0,Web应用程序的编译将是正确的。

问题

是否存在与针对旧System.Web.Mvc.dll 2.0编译组件相关的任何缺点,考虑到这样的事实,这样的组件将与使用较新版本的System.Web.Mvc.dll的应用程序一起使用?另一个事实是,某些类型被转发到其他库,如System.Web.WebPages.dll?这不是问题吗?

也许更好......选项只是使用最新版本的System.Web.Mvc.dll编译这个组件,并粗略地忽略使用以前版本的MVC框架的所有应用程序?

一般来说,使用某些外部引用编译共享程序集的首选方法是什么,而这些引用存在于多个版本中?

1 个答案:

答案 0 :(得分:0)

上面指定的示例将不起作用,因为Type与程序集相关,因此,由于类型已移动到另一个程序集,因此无法找到它。 如果在D中你将引用A和B vers2和C: enter image description here 你将有例外: enter image description here 如果您将引用版本1: enter image description here 你将获得结果(我输入完整的类型名称和完整的程序集名称):

A.TypeA|A, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
A.OtherType|A, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
B.OtherType|B, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
C.C|C, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

也许解决方案是针对几个版本的System.Web.Mvc.dll编译几个版本的* .dll。类似的解决方案是针对x86和x64 dll(System.Data.SQLite.dll)完成的 另一个解决方案是通过反射来检查类型是哪个程序集,然后使用reflecion动态创建它。

相关问题