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