我正在使用第三方 dll。我在某个命名空间中使用一个类namespace.class
。
在较新的版本中,该类已被移至另一个命名空间,所以现在它是newnamespace.newpart.class
. 我的代码需要支持这两种情况。我该如何解决这个问题?
我正在使用第三方 dll。我在某个命名空间中使用一个类namespace.class
。
在较新的版本中,该类已被移至另一个命名空间,所以现在它是newnamespace.newpart.class
. 我的代码需要支持这两种情况。我该如何解决这个问题?
如果一个类存在于两个命名空间中,则它不是同一个类。这是两个不同的班级。
有无数种方法可以“支持”不同的类,但这完全取决于您的实现,即“支持两种情况”是什么意思。
我的第一个建议是确保您的代码库使用相同的程序集,因此重构您的代码,使其保持一致并使用较新的版本——然后整个问题就消失了。
如果这不是可取的,那么您必须根据正在使用的版本在文件中为其添加别名,例如:
旧版 .cs 文件:
using ThirdPartyClass = ThirdPartyNamespace1.Class
较新的 .cs 文件:
using ThirdPartyClass = ThirdParty.OtherNameSpace.Class
请注意,根据新旧版本之间的兼容性,您可能会遇到问题。您真的应该考虑选项 1。“我不想在我的代码中全部更改”的借口不是借口(我不是在推断它是,只是说:))
开发第 3 方 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");
}
目前,当您的应用程序链接时,必须知道命名空间。因此,您不能只以相同的方式编写支持两个不同 dll 的应用程序。
所以编译后没有办法改变dll。
如果一个或另一个可用,您可以尝试处理您的代码以使用不同的类。
您可以执行此操作的方法之一是使用 MEF。在单独的程序集中编写两个适配器类/MEF 对象,检查您拥有的第三方库并加载适当的适配器类。
假设该类是唯一的(即它已完全从namespace.class
to移动namespace.newpart.class
,您可以只包含两个命名空间......
这应该可以编译,但在运行时如果库被换出,它将无法工作......