Come posso dichiarare stringhe costanti per l'utilizzo sia in una DLL non gestita C ++ e in un'applicazione C #?

StackOverflow https://stackoverflow.com/questions/2449405

Domanda

curently sto passando i miei valori const string dal mio C ++ nel mio C # in fase di avvio tramite una richiamata, ma mi chiedo se c'è un modo di definirli in un file C ++ di intestazione che posso quindi fare riferimento anche al C #.

ho già fare questo con le enumerazioni in quanto sono facili. Includo un file in entrambi i miei C ++ progetto di libreria (tramite un file .h con un pragma una volta in cima), e la mia applicazione C # (come un link):

#if _NET
public
#endif
enum ETestData
{
    First,
    Second
};

So che può sembrare disordinato, ma funziona:)

Ma ... come posso fare lo stesso con le costanti di stringa -? Sto inizialmente pensando la sintassi è troppo diverso tra le piattaforme, ma forse c'è un modo

Utilizzando la sintassi intelligente che coinvolge #if _NET, #defines etc?

Utilizzo di file di risorse?

Utilizzo di una libreria C ++ / CLI?

Tutte le idee?

È stato utile?

Soluzione

Call me divertente, ma penso che il modo migliore per farlo è usare C ++ / CLI e C ++.

Questo consente di #include le stesse stringhe in due contesti diversi e lasciare che il compilatore fare la magia. Questo vi darà array di stringhe

// some header file
L"string1",
L"string2",
L"string3",

// some C++ file
static wchar_t*[] string = {
#include "someheaderfile.h"
};

// in some C++/CLI file
array<String^>^ myArray = gcnew array<String^> {
#include "someheaderfile.h"
};

altrimenti è possibile utilizzare il preprocessore C verso l'esterno:

// in somedefineset
#define SOME_STRING_LITERAL L"whatever"

// in some C++ file
#include "somedefineset.h"
const wchar_t *kSomeStringLiteral = SOME_STRING_LITERAL

// in some C++/CLI file
literal String ^kSomeStringLiteral = SOME_STRING_LITERAL;

Altri suggerimenti

Una costante C # stringa assumerà la forma:

public const string MyString = "Hello, world";

Credo che il modo migliore in C ++ è:

const std::string MyString ="Hello, world";

string in C # è solo un alias per il tipo .NET, String. Un modo per fare questo sarebbe fare un # define C ++:

#define String const std::string

E il tuo codice comune sarebbe simile a questa:

   // at the beginning of the file
   #if !_NET
   #define String const std::string
   #endif

   // For each string definition
   #if _NET
   public const
   #endif
   String MyString = "Hello, world";

Devo ammettere che non ho provato, ma sembra che funzioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top