簡體   English   中英

從C#,C ++ / CLI和C ++共享枚舉

[英]Sharing an enum from C#, C++/CLI, and C++

我有一個由三部分組成的庫。 首先是本機C ++,它提供實際功能。 其次是C ++庫的C ++ / CLI包裝器/適配器,以簡化C#到C ++的轉換。 最后我有一個C#庫,它通過C ++ / CLI適配器調用C ++庫。

現在我有兩組並行枚舉定義,一個存儲在.cs文件中,另一個存儲在.h文件中。 這帶來了雙重問題:

  1. 我有雙重維護。 我必須始終在兩個文件位置同步枚舉的更改。
  2. 兩個枚舉使用的命名空間應該相同,但C ++ / CLI包裝器(它們查看兩組枚舉並在它們之間進行轉換)會引發命名沖突。

現在,我不知道這樣的解決這個那個會解決這兩個問題。 思考?

即使您在本機C ++中包含C#枚舉(如第一個鏈接中所示 ),兩個枚舉都不是“相同”,C ++枚舉只是一個命名整數列表,而C#枚舉是從Enum派生的。 因此,在嘗試同時使用它們時,您會在C ++ / CLI中發生沖突。

一種可能的解決方案是使用預處理器,以便C ++ / CLI程序集在不同的名稱空間中看到兩個枚舉:

// shared_enum.h

#undef ENUMKEYWORD
#undef ENUMNAMESPACE

#ifdef MANAGED
#define ENUMKEYWORD public enum class
#define ENUMNAMESPACE EnumShareManaged
#else
#define ENUMKEYWORD enum
#define ENUMNAMESPACE EnumShare
#endif

namespace ENUMNAMESPACE
{
    ENUMKEYWORD MyEnum
    {
        a = 1,
        b = 2,
        c = 3,
    };
}

在您的C ++ / CLI代碼中,包含如下內容:

#undef MANAGED
#include "shared_enum.h"
#define MANAGED
#include "shared_enum.h"

這使您EnumShareManaged::MyEnum在C ++ / CLI代碼中區分這兩種枚舉EnumShare::MyEnumEnumShareManaged::MyEnum

編輯:剛剛發現這個SO帖子顯示了在非托管和托管枚舉之間進行轉換的正確方法,這肯定也會在這里工作。 例如,在C ++ / CLI中,從托管到非托管枚舉的轉換可以這樣完成:

void MyWrapperClass::MyWrapperFunction(EnumShareManaged::MyEnum mx)
{
    EnumShare::MyEnum nx = static_cast<EnumShare::MyEnum>(mx);
    // call a native function "func"
    func(nx);
}

考慮編寫代碼生成器程序,該程序使用枚舉讀取本機h文件文件並生成另一個h文件,將枚舉轉換為C ++ / CLI枚舉類。 此類代碼生成器可用於Custom Build Step上的C ++ / CLI項目,從而生成所需的CLI枚舉。

我使用這種方法生成本機包裝類,以便在非托管C ++中獲取Enum :: GetNames和Enum :: GetName函數。

只需將#include "Enum.cs"指令放在外部命名空間中即可解決命名沖突問題。

編輯:Brent建議的變體是使用#define替換.cs文件中聲明的命名空間之一(甚至是枚舉名稱本身)。 這也避免了命名沖突,而不會使命名空間層次結構更深入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM