Выделение статического константного char * из C ++ в C #

0

У меня есть часть кода, и я хотел бы знать, правильно это или нет:

hello.cpp

static const char _someGlovalVar[] = "my persistant gloval variable";


const char* DLLInterfaceGetName()
{
    return _someGlovalVar;  
}

hello.h

DLL_EXPORT const char* DLLInterfaceGetName();

Hello.cs

[DllImport("hello.dll", EntryPoint = "DLLInterfaceGetName", CharSet = CharSet.Ansi)]
public static extern string DLLInterfaceGetName();

Это верно?

  • 0
    возможный дубликат DllImport и char *
  • 0
    Выглядит корректно, но параметр id должен быть либо добавлен в ваше объявление и определение C ++ DLLInterfaceGetName либо удален из вашего объявления C #.
Показать ещё 1 комментарий
Теги:
static
global-variables
marshalling

2 ответа

2

Измените возвращаемое значение на IntPtr вместо строки.

[DllImport("hello.dll", EntryPoint = "DLLInterfaceGetName", CharSet = CharSet.Ansi)]
public static extern IntPtr DLLInterfaceGetName();

Затем, когда вы вызываете его в коде С#, переместите указатель в строку С#:

IntPtr cstr = DLLInterfaceGetName();
String str = Marshal.PtrToStringAnsi(cstr);

Кроме того, дважды проверьте, что вы используете соглашение о правом вызове в DLLImport. У меня была проблема, потому что она использует StdCall по умолчанию, и я действительно хотел Cdecl.

  • 0
    На самом деле, мой ответ на самом деле не отвечает на ваш вопрос - он просто демонстрирует другой способ сделать это. Я нашел это: msdn.microsoft.com/en-us/magazine/cc164193.aspx Там есть некоторая информация о маршалинге возвращаемых значений, особенно строк. Кажется, это указывает на то, что ваш код должен работать за кулисами так, как вам хотелось бы, создав строковый объект и скопировав в него символ char *, прежде чем передать его вам.
0

Это работает? В этом случае, я не думаю, что вы должны заботиться о чем-то еще :)

Хотя лично я немного обеспокоен тем, как это обрабатывается. Статический указатель const char [], вероятно, находится в разделе кода, не так ли? Надеюсь,.NET marshaller копирует данные в строке в свою собственную строку. Я не уверен, как сторона CPP справляется с этим - возможно ли, что разные компиляторы могут производить значительно разные результаты?

А также, не следует ли положить \0 в конце строки? Как вызывающий абонент знает, как долго строка с помощью char[]? Я думаю, что если это не сработает для вас, это причина.

  • 0
    Да, кажется, что это работает, однако я не уверен, что это теоретически правильно. В режиме выпуска есть некоторые нарушения прав доступа в библиотеке, но я до сих пор не нашел причину. У меня есть только подозрение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню