我被要求帮助处理包含用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,以便没有客户需要重新编译?
答案 0 :(得分:0)
你必须先了解这里发生了什么。
如果您的客户使用版本1编译可执行文件,则表示他们希望该接口位于Location1.dll中。
如果更改此设置,则会出现兼容性错误,因此必须重新编译。完成,就是这样,我的朋友无处可去。。
但是您可能有一个选项:使用ObsoleteAttribute
(see MSDN link),这会向客户的IDE发出警告,他们将看到他们不再使用此界面。 但是他们仍然需要重新编译。
话虽如此,还有一个终极问题:你为什么要这样做呢?
您有一个向您的客户发布的库,您不会移动任何东西。在设计公共框架时,您应该只添加内容,而不是更改或删除它们,因为每次引入兼容性问题时,您的客户都必须重新编译!
以下是MSDN Framework Design Guidelines的链接,其中说明了如何设计库(或框架)。