Как я могу объявить константные строки для использования в неуправляемой DLL C ++ и в приложении C #? - PullRequest
7 голосов
/ 15 марта 2010

В настоящее время я передаю свои значения константных строк из моего C ++ в мой C # при запуске с помощью обратного вызова, но мне интересно, есть ли способ определить их в заголовочном файле C ++, к которому я могу затем обратиться в C #.

Я уже делаю это с перечислениями, поскольку они просты. Я включаю файл как в мой проект библиотеки C ++ (через файл .h с прагмой один раз вверху), так и в мое приложение C # (в виде ссылки):

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

Я знаю, это звучит грязно, но это работает:)

Но ... как я могу сделать то же самое со строковыми константами - я изначально думал, что синтаксис между платформами слишком разный, но, возможно, есть способ?

Использование умного синтаксиса с использованием #if _NET, #defines и т. Д.?

Использование файлов ресурсов?

Использование библиотеки C ++ / CLI?

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 15 марта 2010

Строковая константа C # будет иметь вид:

public const string MyString = "Hello, world";

Я думаю, что предпочтительный путь в C ++:

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

string в C # - это просто псевдоним для типа .NET, String. Один из способов сделать это - создать C ++ #define:

#define String const std::string

И ваш общий код будет выглядеть так:

   // 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";

Я должен признать, что я не пробовал это, но похоже, что это будет работать.

1 голос
/ 15 марта 2010

Назовите меня забавным, но я думаю, что лучший способ сделать это - использовать C ++ / CLI и C ++.

Это позволяет вам # включить те же строки в два разных контекста и позволить компилятору творить чудеса. Это даст вам массивы строк

// 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"
};

в противном случае вы можете использовать препроцессор C прямо:

// 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;
...