【问题标题】:Reference VB.NET Interface in Different Assembly without Recompiling?在不重新编译的情况下在不同的程序集中引用 VB.NET 接口?
【发布时间】:2016-08-31 22:37:56
【问题描述】:

有人要求我帮助开发包含用 VB.NET 编写的 DLL 的产品。客户的可执行文件引用这些 DLL。抽象一下情况:

背景:

产品LocationProduct 的版本1 包含Location1.dll,其中包括命名空间Country.Province 中的接口ICounty。客户使用 Location1.dll 编译他们的可执行文件。

 Namespace Country.Province

     Public Interface ICounty 
         Property District As String
     End Interface

 End Namespace

LocationProduct 的第 2 版除了 Location1.dll 之外还包含 Location2.dll。接口 ICounty 已从 Location1.dll 移至 Location2.dll,但接口及其命名空间未更改。新客户使用 LocationProduct 的第 2 版并参考 Location1.dll 和 Location2.dll 编译他们的可执行文件。

问题:

一位客户的可执行文件引用了 LocationProduct 的版本 1,该客户尝试升级到版本 2。客户收到异常“无法从程序集 'Location1... 加载类型 'Country.Province.ICounty'”。

如果接口 ICounty 从 Location2.dll 移回 Location1.dll,使用版本 2 编译的可执行文件会出现类似的异常,“无法从程序集 'Location2... 加载类型 'Country.Province.ICounty'”。

有没有办法改变 LocationProduct 让客户不需要重新编译?

【问题讨论】:

  • 当您说尝试升级到版本 2 时,他们是否升级了可执行文件和 DLL 文件?
  • 客户的产品与 LocationProduct 分开安装。一位客户使用版本 1 的 LocationProduct 构建了他的可执行文件。客户后来卸载了版本 1 并安装了版本 2。客户希望他的可执行文件能够与 LocationProduct 的版本 2 一起使用,而无需重新编译。但是,LocationProduct 的版本 1 和 2 没有保持兼容性,因为 ICounty 已从 Location1.dll 移至 Location2.dll。我们希望避免要求客户在将 LocationProduct 从版本 1 升级到版本 2 后重新编译他们的可执行文件。

标签: vb.net


【解决方案1】:

你必须先了解这里发生了什么。

如果您的客户使用版本 1 编译可执行文件,这意味着他们希望接口位于 Location1.dll 中。

如果更改此设置,则会违反兼容性,因此必须重新编译。完成,就是这样,我的朋友没办法。

但是您可能有一个选择:使用ObsoleteAttribute (see MSDN link),这将在您的客户的 IDE 中创建一个警告,他们将看到他们不应该再使用此接口。 但他们仍然需要重新编译

话虽如此,最终的问题是:你到底为什么要这样做?

您有一个发布给客户的库,您无需移动任何东西。当您设计公共框架时,您应该只添加东西,而不是更改或删除它们,因为每次您引入兼容性问题时,您的客户都必须重新编译!

这是一个指向MSDN Framework Design Guidelines 的链接,它解释了您应该如何设计一个库(或框架)。

【讨论】:

  • 感谢您的解释。当我在事情发生后被要求提供帮助后调查此事时,我得出了类似的结论,但希望我错过了一些东西。我缺乏足够的声誉来计算我的支持。
猜你喜欢
  • 2010-09-07
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 2011-04-07
相关资源
最近更新 更多