1

我正在使用第三方 dll。我在某个命名空间中使用一个类namespace.class

在较新的版本中,该类已被移至另一个命名空间,所以现在它是newnamespace.newpart.class. 我的代码需要支持这两种情况。我该如何解决这个问题?

4

6 回答 6

3

如果一个类存在于两个命名空间中,则它不是同一个类。这是两个不同的班级。

有无数种方法可以“支持”不同的类,但这完全取决于您的实现,即“支持两种情况”是什么意思。

于 2013-07-11T11:08:23.947 回答
2

我的第一个建议是确保您的代码库使用相同的程序集,因此重构您的代码,使其保持一致并使用较新的版本——然后整个问题就消失了。

如果这不是可取的,那么您必须根据正在使用的版本在文件中为其添加别名,例如:

旧版 .cs 文件:

using ThirdPartyClass = ThirdPartyNamespace1.Class

较新的 .cs 文件:

using ThirdPartyClass = ThirdParty.OtherNameSpace.Class

请注意,根据新旧版本之间的兼容性,您可能会遇到问题。您真的应该考虑选项 1。“我不想在我的代码中全部更改”的借口不是借口(我不是在推断它是,只是说:))

于 2013-07-11T11:08:20.040 回答
2

开发第 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");
}
于 2013-07-11T11:13:37.707 回答
0

目前,当您的应用程序链接时,必须知道命名空间。因此,您不能只以相同的方式编写支持两个不同 dll 的应用程序。

所以编译后没有办法改变dll。

如果一个或另一个可用,您可以尝试处理您的代码以使用不同的类。

于 2013-07-11T11:09:52.620 回答
0

您可以执行此操作的方法之一是使用 MEF。在单独的程序集中编写两个适配器类/MEF 对象,检查您拥有的第三方库并加载适当的适配器类。

于 2013-07-11T11:10:23.323 回答
-1

假设该类是唯一的(即它已完全从namespace.classto移动namespace.newpart.class,您可以只包含两个命名空间......

这应该可以编译,但在运行时如果库被换出,它将无法工作......

于 2013-07-11T11:07:50.547 回答