У меня есть следующая функция теста установить в проекте C:Передача строки из функции C на C#
__declspec(dllexport) int test(char *str, int strlen){
char* h = "Hello";
int length = 5;
for(int i = 0; i < length; i++){
str[0] = h[0];
}
return strlen;
}
И в моем C# проекта Объявляет метод следующим образом:
[DllImport("solver.dll", CharSet = CharSet.Unicode ,CallingConvention = CallingConvention.Cdecl)]
public static extern int test(StringBuilder sol, int len);
И Я пытаюсь использовать его в моем проекте так:
StringBuilder sol = new StringBuilder(15);
int t = test(sol, sol.Capacity);
string str = sol.ToString();
Я хотел бы передать «привет» обратно в C# код в качестве теста, но когда я запускаю код в StringBuilder остается пустым, и хотя 15 передается функции C как длина, когда функция C возвращает длину, она возвращает «случайное» большое число, например 125822695. Что мне не хватает?
Возможно, вам не хватает, что 'char' является MBCS, а не Unicode. Попытайтесь изменить это на 'wchar_t'. Но я думаю, что их больше нет. Вы пытались сделать это наоборот, то есть создать оболочку C++/CLR (управляемый C++) вокруг вашей библиотеки C и использовать это вместо прямого возиться с 'DllImport'? – donmartin
Вы объявляете свой метод как «CharSet = CharSet.Unicode», но похоже, что он использует 8-битные символы для меня. Во-вторых, 'str [0] = h [0];' ... Не должно быть 'str [i] = h [i];'? На самом деле, похоже, могут быть другие ошибки в функции C. Я предлагаю вам (единицу) проверить его правильно в среде C, прежде чем пытаться вызвать его из C#. –
@KrisVandermotten Вот что я получаю для написания кода рано утром. Я также пробовал CharSet.Ansi, но ни один из них не работал. –