2016-10-18 2 views
0

У меня есть следующая функция теста установить в проекте 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. Что мне не хватает?

+0

Возможно, вам не хватает, что 'char' является MBCS, а не Unicode. Попытайтесь изменить это на 'wchar_t'. Но я думаю, что их больше нет. Вы пытались сделать это наоборот, то есть создать оболочку C++/CLR (управляемый C++) вокруг вашей библиотеки C и использовать это вместо прямого возиться с 'DllImport'? – donmartin

+0

Вы объявляете свой метод как «CharSet = CharSet.Unicode», но похоже, что он использует 8-битные символы для меня. Во-вторых, 'str [0] = h [0];' ... Не должно быть 'str [i] = h [i];'? На самом деле, похоже, могут быть другие ошибки в функции C. Я предлагаю вам (единицу) проверить его правильно в среде C, прежде чем пытаться вызвать его из C#. –

+0

@KrisVandermotten Вот что я получаю для написания кода рано утром. Я также пробовал CharSet.Ansi, но ни один из них не работал. –

ответ

3

ряд проблем:

  1. Вы состояние CharSet.Unicode в C#, но использовать ANSI в неуправляемом коде.
  2. Вы пишете только первому персонажу.
  3. Вы игнорируете значение strlen, переданное функции.
  4. Вы не пытаетесь написать нуль-терминатор.

Что касается значения, возвращаемого функцией, которое не может быть объяснено кодом, который вы представляете. Из вашего вопроса есть что-то, что нам нужно увидеть, чтобы это объяснить.

Общепринято, когда мы видим эти вопросы, что неуправляемый код явно нарушен. Трудно написать правильные p/invokes для исправления неуправляемого кода. Попытка отладки p/invoke и неуправляемого кода в одно и то же время намного сложнее. Сначала проверьте неуправляемый код в неуправляемом состоянии. Только когда вы уверены, что это правильно, вы должны перейти на запись своего p/invoke.