Come posso dichiarare stringhe costanti per l'utilizzo sia in una DLL non gestita C ++ e in un'applicazione C #?
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?
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.