我有以下程序集分类(程序集已签名并引用特定版本限制设置为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框架的所有应用程序?
一般来说,使用某些外部引用编译共享程序集的首选方法是什么,而这些引用存在于多个版本中?
答案 0 :(得分:0)
上面指定的示例将不起作用,因为Type与程序集相关,因此,由于类型已移动到另一个程序集,因此无法找到它。
如果在D中你将引用A和B vers2和C:
你将有例外:
如果您将引用版本1:
你将获得结果(我输入完整的类型名称和完整的程序集名称):
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动态创建它。