Frage

Gibt es eine Möglichkeit, eine Enum -Definition zwischen nativem (nicht verwaltetem) C ++ und (verwaltet) C#zu teilen?

Ich habe die folgende Aufwand in vollständig nicht verwaltetem Code:

enum MyEnum { myVal1, myVal2 };

Unsere Anwendung verwendet manchmal eine verwaltete Komponente. Diese C# -Komponente erhält die ENUM -Elementwerte als INT über eine verwaltete C ++ - Interop -DLL (aus der nativen DLL). (Die Interop -DLL lädt nur, wenn die C# -Komponente benötigt wird.) Die C# -Komponente hat die Enum -Definition dupliziert:

public enum MyEnum { myVal1, myVal2 };

Gibt es eine Möglichkeit, die Duplikation zu beseitigen, ohne die native C ++ - DLL in eine verwaltete DLL zu verwandeln?

War es hilfreich?

Lösung

Sie können eine einzelne .cs -Datei verwenden und sie zwischen beiden Projekten teilen. #include In C ++ sollte in einer .cs -Datei kein Problem sein.

Dies wäre eine Beispiel -CS -Datei:

#if !__LINE__    
namespace MyNamespace
{
    public 
#endif

// shared enum for both C, C++ and C#
enum MyEnum { myVal1, myVal2 };

#if !__LINE__
}
#endif

Wenn Sie mehrere Enum in einer Datei wünschen, können Sie dies tun (obwohl Sie die Öffentlichkeit als C / C ++ vorübergehend definieren müssen):

#if __LINE__
#define public
#else
namespace MyNamespace
{
#endif

    public enum MyEnum { MyEnumValue1, MyEnumValue2 };
    public enum MyEnum2 { MyEnum2Value1, MyEnum2Value2 };
    public enum MyEnum3 { MyEnum3Value1, MyEnum3Value2 };

#if __LINE__
#undef public
#else
}
#endif

Andere Tipps

Danke für das Teilen!

Ich habe ein bisschen herumgespielt und einen Weg gefunden, mehrere Aufzünder und ständige Erklärungen zu haben, ohne Tonnen zusätzlicher Linien zu haben :)

// This is a valid C, C++ and C# file :)
#if __LINE__
#define public
#else
namespace MyCSharpNamespace{
#endif

    public enum MyConstant { MaxStr = 256 };
    public enum MyEnum1{ MyEnum1_A, MyEnum1_B };
    public enum MyEnum2{ MyEnum2_A, MyEnum2_B };

#if __LINE__
#undef public
#else
}
#endif

Denken Sie daran, Ihre Datei *.cs zu benennen

Sie können die C# -Bibliothek COM aussetzen und dann die Typbibliothek in den nicht verwalteten Code importieren. Auf diese Weise können Sie den in der C# -Bibliothek definierten Enum in der nicht verwalteten Bibliothek verwenden.

Nicht verwaltete C ++ - und C# leben in zwei verschiedenen Welten, daher gibt es keine Möglichkeit, dieselbe Aufzündung zu verwenden, ohne die C ++ - DLL in einen verwalteten zu verwandeln.

Und selbst dann benötigen Sie wahrscheinlich die Duplikation in der verwalteten C ++ - DLL.

Ein C ++ - Enum ähnelt einer Liste von Konstanten, während ein C# Enum die Enum -Klasse erbt und daher einige "Tricks" liefert. So wie Sie sehen können, sind sie sie sehr anders.

Wenn es keine Rolle spielt, ob die native C ++ - DLL nativ oder verwaltet ist, würde ich sie in eine verwaltete und die nativen Anrufe in eine verwaltete C ++ - Schicht einwickeln.

Auf diese Weise können Sie die Enum-Duplikation innerhalb der C ++-DLL und Sie auch gleichzeitig die gesamte Interop beseitigen :-)

Ich hatte das gleiche Problem in der Vergangenheit und habe es mit Vorprozessordefinitionen gelöst.

In Ihrem nicht verwalteten Code in einen Header, der auch von Ihrem verwalteten Wrapper aufgenommen werden kann, geben Sie Ihre Aufzählungsartikel in einen #define.

Verwenden Sie dann in Ihren verwalteten und nicht verwalteten Aufzählungsdefinitionen denselben #Define für beide Verwendungen.

Die Bewegung der Aufzählungen zwischen der verwalteten und nicht verwalteten Welt sieht etwas böse aus (im Grunde ist eine Besetzung benötigt), aber für Ihren Anrufer in der nicht verwalteten Welt wird sie gut aussehen und sich gut anfühlen.

Viel Glück,

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top