我正在使用第三方dll。我在某个命名空间namespace.class
中使用了一个类。
在较新的版本中,该类已被移动到另一个名称空间中,因此它现在为newnamespace.newpart.class
。我的代码需要支持这两种情况。我该如何解决这个问题?
答案 0 :(得分:3)
如果一个类存在于两个名称空间中,则它不是同一个类。这是两个不同的类别。
有很多方法可以“支持”不同的课程,但这完全取决于你的实施,即“支持两种情况”的含义。
答案 1 :(得分:2)
我的第一个建议是确保您的代码库使用相同的程序集,因此重构您的代码以使其一致并使用较新的版本 - 然后整个问题就消失了。
如果这不合适,那么根据使用的版本,您必须在文件中对其进行别名,例如:
旧版.cs文件:
using ThirdPartyClass = ThirdPartyNamespace1.Class
较新的.cs文件:
using ThirdPartyClass = ThirdParty.OtherNameSpace.Class
注意,您可能会遇到问题,具体取决于旧版本和新版本之间的兼容性。你真的应该考虑选项1.并且“我不想在我的代码中改变它”的借口不是借口(我不是在推断它,只是说:))
答案 2 :(得分:2)
开发第三方dll的后期绑定并检查它是哪个版本。您可以在正确的命名空间中创建正确对象的新实例。
这里有一些示例代码:
//load dll
System.Reflection.Assembly myDllAssembly =
System.Reflection.Assembly.LoadFile("myspeciallibrary.dll");
//create object
Object MyDLLObjectInstance;
//initialize object
if (myDllAssembly.ImageRuntimeVersion == "version2")
{
MyDLLObjectInstance = (Object)myDllAssembly.CreateInstance("MyDLLNamespace.MyDLLObject");
}
else
{
MyDLLObjectInstance = (Object)myDllAssembly.CreateInstance("MyDLLNamespace.NewNameSpace.MyDLLObject");
}
答案 3 :(得分:0)
目前,当您的应用程序链接时,必须知道名称空间。所以你不能以同样的方式编写支持两个不同dll的应用程序。
因此编译后无法更改dll。
如果有一个或另一个类可用,您可以尝试处理代码以使用不同的类。
答案 4 :(得分:0)
您可以使用MEF的方法之一。在单独的程序集中编写两个适配器类/ MEF对象,检查您拥有的第三方库并加载适当的适配器类。
答案 5 :(得分:-1)
假设该类是唯一的(即它已完全从namespace.class
移动到namespace.newpart.class
,您可以只包含两个名称空间......
这应该编译,但是在运行时如果库被换出它就不会工作......