考虑以下情况:
WidgetCompany在2006年生成了一个名为Widget.dll 1.0版的.NET DLL。我在整个.NET应用程序中使用了这个Widget.dll文件。随着时间的推移,WidgetCompany一直在更新Widget.dll,我从不费心跟上,继续用我的软件发布Widget.dll 1.0版本。现在是2011年,我的项目现在是一个.Net 3.5应用程序,而WidgetCompany已经推出了Widget.dll 2.0版本。它的外观和功能几乎与Widget.dll 1.0版完全相同,使用了之前所有相同的命名空间和类型名称。
然而,自1.0以来,Widget.dll版本2.0有许多运行时重大更改,我不能简单地切换到新版本;但是,我不想继续开发1.0版本,因此不断深入挖掘自己。我想做的是在我的项目中使用Widget.dll版本2.0进行所有新开发,同时保持Widget.dll版本1.0,直到我找到时间将我的所有1.0消耗转换为更新的2.0代码。
现在,对于初学者来说,我显然不能简单地在Visual Studio中引用Widget.dll(Ver 1.0)和Widget.dll(Ver 2.0)。这样做会给我以下消息:“无法添加对'Widget.dll'的引用。项目中已经存在对组件'Widget'的引用。”为了解决这个问题,我只需将版本2.0 Widget.dll
重命名为Widget.3.dll
即可。但这就是我被困住的地方。任何尝试引用“dll”中的类型都会导致歧义,编译器显然没有任何关于我在这个或那个案例中真正想要的线索。
我能做些什么能为DLL提供一个新的“root”命名空间吗?例如,如果我可以说“Widget.dll
具有Legacy
的新根名称空间”,那么我可以更新现有代码以引用Legacy.<RootNamespace>
命名空间中找到的类型,而所有新代码都可以简单地引用<RootNamespace>
命名空间中的类型。管梦还是现实?对于这种情况是否有其他解决方案(除了“首先没有陷入这种情况”)?
答案 0 :(得分:2)
这是我的头脑。
更改新版本的窗口小部件的名称,并保留旧版本以保持旧版代码正常工作。
然后创建一个项目,它是新窗口小部件DLL的包装器。
将这个新的包装器项目添加到我现有的解决方案中,然后从现有代码中引用该包装器,然后编译器应该忽略类型冲突,因为新的小部件位于不同的项目中。