Взаимодействие отправки строки из C # в C ++ - PullRequest
2 голосов
/ 25 марта 2009

Я хочу отправить строку из C # в функцию в собственной C ++ DLL.

Вот мой код: Сторона C #:

[DllImport(@"Native3DHandler.dll", EntryPoint = "#22", 
    CharSet = CharSet.Unicode)]
private static extern void func1(byte[] path);

public void func2(string path)
{
   ASCIIEncoding encoding = new ASCIIEncoding();
   byte[] arr = encoding.GetBytes(path);
   func1(this.something, arr);
}

Сторона C ++:

void func1(char *path)
{
    //...
}

То, что я получаю на стороне C ++, это пустая строка, каждый раз, независимо от того, что я посылаю Помощь

Спасибо.

Ответы [ 5 ]

2 голосов
/ 16 ноября 2010

Работает нормально для меня без дополнительных инструкций по сортировке в VS2008:

C # сторона:

[DllImport("Test.dll")]
public static extern void getString(StringBuilder theString, int bufferSize);

func()
{
  StringBuilder tstStr = new StringBuilder(BufSize);
  getString(tstStr, BufSize);
}

C ++ сторона:

extern "C" __declspec(dllexport) void getString(char* str, int bufferSize)
{
  strcpy_s(str, bufferSize, "FOOBAR");
}
2 голосов
/ 25 марта 2009

Похоже, у вас есть 2 проблемы. Во-первых, ваш родной C ++ использует строку ANSI, но вы указываете юникод. Во-вторых, проще всего упорядочить строку как строку.

Попробуйте изменить DllImport на следующее

[DllImport(
  @"Native3DHandler.dll", 
  EntryPoint = "#22",  
  CharSet = CharSet.Ansi)]
private static extern void func1(void* something, [In] string path);
0 голосов
/ 27 марта 2009

Маршалинг по умолчанию для строк http://msdn.microsoft.com/en-us/library/s9ts558h.aspx

0 голосов
/ 25 марта 2009

Если вы просто хотите отправить строку, просто объявите параметр func1 как строку. Если вы хотите получить строку, объявите ее как StringBuilder и выделите достаточно буферного пространства для того, что вы хотите получить.

0 голосов
/ 25 марта 2009

Ваша декларация неверна. Параметр должен иметь тип string, и вы должны установить кодировку набора символов в Ansi, например так:

[DllImport(@"Native3DHandler.dll", EntryPoint = "#22", 
    CharSet = CharSet.Ansi)]
private static extern void func1(string path);

Предполагается, что вы не изменяете содержимое переменной пути в своем коде C ++. Затем вы передаете строковый параметр напрямую (без использования оболочки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...