9
votes

Comment puis-je partager une constante entre C # et C ++ Code?

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?

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.

Toute autre suggestion?


0 commentaires

5 Réponses :


6
votes

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 #.

Ainsi, xxx

devient xxx

que vous devriez pouvoir pouvoir être capable à p / invoquer de c #.


1 commentaires

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 dans principal () .



0
votes

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.

Remarque: je n'ai pas essayé cela, je spécifie seulement que cela doit devrait travailler.


0 commentaires

1
votes

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: xxx

ceci vous donnera: xxx

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 .

Vous pouvez probablement faire un travail similaire dans PowerShell mais je ' Je ne suis pas vraiment bien versé dans cela.


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 une constante du tout. Mettre l'adresse dans un fichier de configuration et que votre code C # et C ++ le lisez au démarrage.

De cette façon, vous pouvez partager la valeur sans douleur et c'est configurable au cas où vous auriez jamais vouloir le changer à l'avenir.


0 commentaires

6
votes

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> XXX Pré>

ConstatBridge.h H3 >
Console.WriteLine(ConstantBridge.kMagicNumber); // "42"
Console.WriteLine(ConstantBridge.kMagicPhrase); // "Hello World"


0 commentaires

5
votes

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é à à la fois A C # et un projet C ++ ...

  1. Informations de version dans un fichier .cs, dans un emplacement commun.

    comme ceci: xxx

    1. Inclure dans le projet C # à l'aide de Ajouter un article existant ... [Ajouter en tant que lien]
    2. Inclure dans le projet C ++ (dans un fichier .cpp) avec un #include

      comme ceci: xxx

      1. référence en C # avec: myAppversion.Number
      2. Référence en C ++ avec: MyAppversion :: Numéro

1 commentaires

C'est génie. Sale mais je l'aime.