C# 在不同的名称空间中初始化

C# 在不同的名称空间中初始化,c#,.net,namespaces,C#,.net,Namespaces,我正在使用第三方dll。我正在某个名称空间名称空间中使用一个类。class 在较新版本中,该类已被移动到另一个命名空间中,因此现在它是newnamespace.newpart.class。我的代码需要支持这两种情况。如何解决此问题?假设类是唯一的(即,它已完全从名称空间.class移动到名称空间.newpart.class,则可以同时包含这两个名称空间 这应该可以编译,但在运行时,如果库被调出,它将无法工作…假设类是唯一的(即,它已完全从namespace.class移动到namespace.n

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


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

假设类是唯一的(即,它已完全从
名称空间.class
移动到
名称空间.newpart.class
,则可以同时包含这两个名称空间


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

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


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

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

如果不需要这样做,则必须根据使用的版本在文件中对其进行别名,例如:

遗留.cs文件:

using ThirdPartyClass = ThirdPartyNamespace1.Class
using ThirdPartyClass = ThirdParty.OtherNameSpace.Class
更新的.cs文件:

using ThirdPartyClass = ThirdPartyNamespace1.Class
using ThirdPartyClass = ThirdParty.OtherNameSpace.Class

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

我的第一个建议是确保您的代码库使用相同的程序集,因此重构您的代码,使其保持一致并使用较新的版本,这样整个问题就解决了

如果不需要这样做,则必须根据使用的版本在文件中对其进行别名,例如:

遗留.cs文件:

using ThirdPartyClass = ThirdPartyNamespace1.Class
using ThirdPartyClass = ThirdParty.OtherNameSpace.Class
更新的.cs文件:

using ThirdPartyClass = ThirdPartyNamespace1.Class
using ThirdPartyClass = ThirdParty.OtherNameSpace.Class

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

< P>如果一个类存在于两个命名空间中,它就不是同一个类。这是两门不同的课


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

如果一个类存在于两个名称空间中,它就不是同一个类。这是两门不同的课


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

目前,当您的应用程序链接时,必须知道名称空间。所以你不能仅仅用同样的方式编写支持两个不同DLL的应用程序

所以编译后没有办法更改dll


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

此时,当您的应用程序链接时,必须知道名称空间。所以你不能仅仅用同样的方式编写支持两个不同DLL的应用程序

所以编译后没有办法更改dll


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

实现这一点的方法之一是使用MEF。在单独的程序集中编写两个适配器类/MEF对象,检查您拥有的第三方库,并加载相应的适配器类。

可以这样做的方法之一是使用MEF。在单独的程序集中写入两个适配器类/MEF对象,检查您拥有的第三方库并加载相应的适配器类。

开发第三方dll的后期绑定并检查其版本。然后可以在正确的命名空间中创建正确对象的新实例

下面是一些示例代码:


开发第三方dll的后期绑定,并检查其版本。然后可以在正确的命名空间中创建正确对象的新实例

下面是一些示例代码:


为什么两种情况都有?如果您需要使用较新版本,则必须更改代码中的用法。好的,您想使用相同的第三方类,使用新函数,还是对旧函数感到满意?我不提供第三方dll。我不知道用户安装了什么版本。什么时候有可能是旧的dll或新的dll?如果您在开发软件时知道,可以使用编译器符号初始化新类或旧类。或者你打算只更新你的软件,而第三方应用程序的dll版本未知?@cansik就是这样。我要更新我的软件,第三方dll的dll版本未知。为什么两种情况都是这样?如果您需要使用较新版本,则必须更改代码中的用法。好的,您想使用相同的第三方类,使用新函数,还是对旧函数感到满意?我不提供第三方dll。我不知道用户安装了什么版本。什么时候有可能是旧的dll或新的dll?如果您在开发软件时知道,可以使用编译器符号初始化新类或旧类。或者你打算只更新你的软件,而第三方应用程序的dll版本未知?@cansik就是这样。我要更新我的软件,第三方dll的dll版本未知。如果他们说“支持两种情况”时不是同时表示支持,这可能是最简单和最好的答案。我不认为这直接回答了问题,但我认为这是实践中最好的解决方案。当执行文件需要处理不同的DLL时,处理案例的成本会很高。如果他们在说“支持两种情况”时不是同时表示支持两种情况,这可能是最简单和最好的答案。我不认为这直接回答了问题,但在我看来,这将是实践中最好的解决方案。当执行文件需要处理不同的DLL时,处理这些案例将非常昂贵。