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?
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.
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":
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.
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 ...
So:
%Vor%#include
So:
%Vor%MyAppVersion.Number
MyAppVersion::Number
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.
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.
Tags und Links c# c++ maintainability idl