当前位置: 首页 > 编程语言 > C#

从C#、C++-CLI和C++共享枚举

时间:2023-04-10 20:55:56 C#

从C#、C++/CLI和C++共享一个枚举我有一个由三部分组成的库。首先是原生C++,它提供了实际的功能。其次是C++库的C++/CLI包装器/适配器,以简化C#到C++的转换。最后我有一个C#库,它通过C++/CLI适配器调用C++库。现在我有两组并行枚举定义,一组存储在.cs文件中,另一组存储在.h文件中。这提出了双重问题:我有双重维护。我必须始终同步两个文件位置中枚举的更改。两个枚举使用的命名空间应该相同,但C++/CLI包装器(查看两组枚举并在它们之间进行转换)导致命名冲突。现在我不确定一个或另一个解决方案是否可以解决任何一个问题。思考?只需将#include"Enum.cs"指令放在外部命名空间中即可解决命名冲突。编辑:布伦特建议的一种变体是使用#define替换.cs文件中声明的命名空间之一(甚至是枚举名称本身)。这也避免了命名冲突,而无需深入命名空间层次结构。即使您在本机C++中包含C#枚举(如第一个链接中所示),两个枚举都不“相同”,C++枚举只是命名整数列表,而C#枚举是从枚举派生的。因此,当您尝试使用它们时,您会在C++/CLI中遇到冲突。一种可能的解决方案是使用预处理器,以便C++/CLI程序集在不同的命名空间中看到两个枚举://shared_enum.h#undefENUMKEYWORD#undefENUMNAMESPACE#ifdefMANAGED#defineENUMKEYWORDpublicenumclass#defineENUMNAMESPACEEnumShareManaged#else#定义ENUMKEYWORD枚举#defineENUMNAMESPACEEnumShare#endifnamespaceENUMNAMESPACE{ENUMKEYWORDMyEnum{a=1,b=2,c=3,};在您的C++/CLI代码中,包含以下内容:#undefMANAGED#include"shared_enum.h"#defineMANAGED#include"shared_enum.h"这使您能够区分C++/CLI代码中的两个枚举EnumShareManaged::MyEnumEnumShare::MyEnum或EnumShareManaged::MyEnum。编辑:刚刚发现这个SOpost显示了在非托管和托管枚举之间转换的正确方法,这肯定也适用于这里。例如,在C++/CLI中,从托管枚举到非托管枚举的转换可以像这样完成:voidMyWrapperClass::MyWrapperFunction(EnumShareManaged::MyEnummx)//调用本地函数"func"func(nx);考虑编写一个代码生成器程序,该程序读取带有枚举的本机h文件并生成另一个将枚举转换为C++/CLI枚举类型的h文件。此类代码生成器可用于自定义构建步骤中的C++/CLI项目,生成所需的CLI枚举。我使用这种方法为非托管C++中的Enum::GetNames和Enum::GetName函数生成本机包装类。以上就是C#学习教程:来自C#、C++/CLI和C++分享的枚举分享的全部内容,如果对大家有用还需要进一步了解C#学习教程,希望大家多多关注——本文来自网络收藏,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: