Wie teile ich eine Konstante zwischen C # - und C ++ - Code?

9

Ich schreibe zwei Prozesse mit C # und WCF für eine und C ++ und WWSAPI für die zweite. Ich möchte in der Lage sein, die Adresse zu definieren, die für die Kommunikation zwischen den beiden an einem einzigen Ort verwendet wird, und beide verwenden C # und C ++. Ist das möglich?

Der nächste, den ich kenne, ist die Definition der Konstante in einer IDL, dann die Verwendung von MIDL und TLBIMP, um sie in eine DLL zu bringen, die von C # konsumiert werden kann. Dies scheint jedoch die Konstante nicht zu entlarven, oder zumindest kann ich nicht herausfinden, wie ich es dazu bringen kann. Vielleicht ist es nur auf Typdefinitionen beschränkt.

Irgendwelche anderen Vorschläge?

    
dlanod 30.06.2010, 02:02
quelle

5 Antworten

5

C # und C ++ haben unterschiedliche Modelle für Konstanten. In der Regel wird die Konstante in der resultierenden C ++ - Binärdatei nicht einmal ausgegeben - sie wird automatisch dort ersetzt, wo sie die meiste Zeit benötigt wird.

Anstatt die Konstante zu verwenden, machen Sie eine Funktion, die die Konstante zurückgibt, die Sie von C # aufrufen können.

Also,

%Vor%

wird

%Vor%

, das Sie P / Invoke von C # aufrufen können.

    
Billy ONeal 30.06.2010, 02:08
quelle
6

Sie können ein separates C ++ / CLI-Projekt erstellen und alle Ihre Konstanten in einer .h -Datei definieren. Erstellen Sie beispielsweise ein C ++ / CLI-Klassenbibliotheksprojekt namens "ConstantBridge" und ein C # -Projekt namens "CSharpProgram":

Konstanten.h

%Vor%

ConstantBridge.h

%Vor%

CSharpProgram.cs

%Vor%

Nun muss das Projekt "CSharpProgram" auf das Projekt "ConstantBridge" verweisen. Ihre anderen nativen C ++ - Projekte können einfach #include "Constants.h" .

Solange Sie nur literal s vom Projekt ConstantBridge referenzieren, wird keine Laufzeitabhängigkeit generiert. Sie können überprüfen, ob Sie ILSpy oder ILdasm verwenden. const in C # und literal in C ++ / CLI werden während der Kompilierung "wörtlich" in die Aufruf-Site kopiert.

    
kizzx2 24.05.2011 07:59
quelle
2

War nicht glücklich mit den anderen Lösungen für meinen Anwendungsfall, also eine etwas hacky Lösung, die besser auf die ursprüngliche Anfrage zu passen scheint; eine Konstante in einer Datei, die in beide ein C # - und ein C ++ - Projekt eingebaut werden kann ...

  1. Versionsinformationen in einer CS-Datei an einem gemeinsamen Speicherort.

So:

%Vor%
  1. In C # -Projekt aufnehmen, indem Sie Vorhandenes Element hinzufügen ... [Als Link hinzufügen]
  2. hinzufügen
  3. Include in C ++ - Projekt (in einer .cpp-Datei) mit einem #include

So:

%Vor%
  1. Referenz in C # mit: MyAppVersion.Number
  2. Referenz in C ++ mit: MyAppVersion::Number
Gaspode 25.01.2017 17:19
quelle
1

Als ich das in der Vergangenheit machen musste, habe ich dem Build-Prozess einfach einen zusätzlichen Pre-Compilation-Schritt hinzugefügt, der automatisch eine Datei aus einer anderen erstellt.

Da sich Ihre Konstanten wahrscheinlich innerhalb einer Klasse in C # befinden, können Sie diese als Quelldatei verwenden:

%Vor%

Dies gibt Ihnen:

%Vor%

Nun ist es etwas, von dem ich nicht weiß, wie ich Visual Studio dazu bringen soll, diesen Schritt auszuführen. Sie müssen untersuchen, ob es überhaupt möglich ist oder nicht. Die UNIXy-Textverarbeitungstools sind wirklich einen Download wert. Ich habe CygWin auf einigen Boxen installiert, aber für etwas, das so lokalisiert ist, könntest du mit einzelnen GnuWin32-Pakete .

Sie könnten wahrscheinlich einen ähnlichen Job in PowerShell machen, aber ich bin nicht wirklich versiert darin.

Nun, das ist ein bisschen ein Klud, also kann ich einen vielleicht besseren Weg für Ihre spezielle Frage vorschlagen. Verwenden Sie überhaupt keine Konstante. Fügen Sie die Adresse in eine Konfigurationsdatei ein und lassen Sie sie beim Starten von Ihrem C # - und C ++ - Code lesen.

Auf diese Weise können Sie den Wert schmerzlos teilen und er ist konfigurierbar für den Fall, dass Sie ihn in Zukunft ändern möchten.

    
paxdiablo 30.06.2010 02:29
quelle
0

Eine einfachere Alternative zu einer Methode für jede Konstante kann eine Klasse sein, die die Konstanten als Instanzeigenschaften enthält. Sie könnten es in C # erstellen und es über COM-Schnittstellen zu C ++ verfügbar machen. Das ist einfacher und weniger fehleranfällig als P / Invoke, da Sie sich nicht darum kümmern müssen, alle Typen und Namen richtig zu machen - alles wird vom Compiler erledigt.

Hinweis: Ich habe das nicht versucht, ich spekuliere nur, dass es funktionieren sollte.

    
EMP 30.06.2010 02:14
quelle

Tags und Links