在不重新编译的情况下参考不同汇编的VB.NET接口?

时间:2016-08-31 22:37:57

标签: vb.net

我被要求帮助处理包含用VB.NET编写的DLL的产品。客户的可执行文件引用这些DLL。摘要情况:

背景:

产品版本1 LocationProduct包含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,以便没有客户需要重新编译?

1 个答案:

答案 0 :(得分:0)

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

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

如果更改此设置,则会出现兼容性错误,因此必须重新编译。完成,就是这样,我的朋友无处可去。

但是您可能有一个选项:使用ObsoleteAttributesee MSDN link),这会向客户的IDE发出警告,他们将看到他们不再使用此界面。 但是他们仍然需要重新编译

话虽如此,还有一个终极问题:你为什么要这样做呢?

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

以下是MSDN Framework Design Guidelines的链接,其中说明了如何设计库(或框架)。