J'écris deux processus utilisant C # et WCF pour un et C ++ et WWSAPI pour la seconde. Je souhaite pouvoir définir l'adresse utilisée pour la communication entre les deux en une seule place et avoir à la fois C # et C ++ l'utiliser. Est-ce possible? P>
Le plus proche que je suis arrivé est de définir la constante dans une IDL, puis utilisez MIDL et TLBIP pour l'obtenir dans une DLL pouvant être consommée par C #. Cependant, cela ne semble pas exposer la constante, ou du moins, je ne peux pas comprendre comment le faire. Peut-être qu'il est limité aux définitions de type uniquement. P>
Toute autre suggestion? P>
5 Réponses :
C # et C ++ ont des modèles différents pour les constantes. En règle générale, la constante ne sera même jamais émise dans le binaire C ++ résultant - il est automatiquement remplacé lorsqu'il est nécessaire la plupart du temps.
plutôt que d'utiliser la constante, faites une fonction qui retourne la constante, que vous pouvez p. / Invoquer de c #. P>
Ainsi, p> devient p> que vous devriez pouvoir pouvoir être capable à p / invoquer de c #. p> p>
Ou les deux. Je laisserais la constante définie et ajouter une fonction qui le renvoie. De cette façon, vous pouvez toujours utiliser acceleration_due_to_gravity code> dans
principal () code>.
Une alternative plus facile à une méthode de chaque constante peut être une classe contenant les constantes comme des propriétés d'instance. Vous pouvez le créer dans C # et l'exposer via des interfaces COM à C ++. C'est plus facile et moins erroné que P / invoke, puisque vous n'avez pas à vous soucier d'obtenir tous les types et tous les noms - tout est fait pour vous par le compilateur. P>
Remarque: je n'ai pas essayé cela, je spécifie seulement que cela doit devrait em> travailler. P>
Quand j'ai dû faire ce genre de choses dans le passé, j'ai simplement ajouté une étape de pré-compilation supplémentaire au processus de construction qui crée automatiquement un fichier d'un autre.
puisque vos constantes seront probablement dans un Classe en C #, vous pouvez l'utiliser comme fichier source: p> ceci vous donnera: p> maintenant, Obtenir un studio visuel pour effectuer cette étape n'est pas quelque chose que je sais faire. Vous devrez étudier si cela est encore possible. Les outils de traitement de texte UNIXY valent vraiment la peine d'être téléchargés. J'ai Cygwin installé sur quelques cases, mais pour quelque chose de ce localisé, vous pourriez vous éloigner d'une personne paquets GNUWIN32 . P> Vous pouvez probablement faire un travail similaire dans PowerShell mais je ' Je ne suis pas vraiment bien versé dans cela. p> C'est un peu un kilomètre de kilomètre afin que je puisse suggérer un moyen potentiellement meilleur pour vous une question particulière. Ne utilisez-vous em> une constante du tout. Mettre l'adresse dans un fichier de configuration et que votre code C # et C ++ le lisez au démarrage. P> De cette façon, vous pouvez partager la valeur sans douleur et em> c'est configurable au cas où vous auriez jamais vouloir le changer à l'avenir. p> p>
Vous pouvez créer un projet C ++ / CLI distinct et définir toutes vos constantes dans un fichier .h code>. Par exemple, Créez un projet de bibliothèque de classe C ++ / CLI appelé "ConstatBridge" et un projet C # appelé "CsharpProgram":
Constantes.h h3>
ConstatBridge.h H3 >
Console.WriteLine(ConstantBridge.kMagicNumber); // "42"
Console.WriteLine(ConstantBridge.kMagicPhrase); // "Hello World"
n'était pas content des autres solutions pour mon étui d'utilisation, une solution légèrement hacky semble mieux adaptée à la demande initiale; une constante dans un fichier qui peut être intégré à comme ceci: p> comme ceci: p>
#include code> li>
ol>
myAppversion.Number code> li>
MyAppversion :: Numéro Code> Li>
ol> p>
C'est génie. Sale mais je l'aime.