Как я могу объявить постоянные строки для использования и в неуправляемом C++ dll и в приложении C#?

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

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

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

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

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

Используя умный синтаксис, включающий #if _NET, #defines и т.д.?

Используя файлы ресурсов?

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

Какие-либо идеи?

7
задан Surfbutler 15 March 2010 в 18:14
поделиться

2 ответа

Назовите меня смешным, но я думаю, что лучший способ сделать это - использовать 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;
1
ответ дан 7 December 2019 в 16:40
поделиться

Строковая константа в 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";

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

2
ответ дан 7 December 2019 в 16:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: