Как импортировать const char * API в C #? - PullRequest
7 голосов
/ 03 февраля 2009

Учитывая эту декларацию C API, как она будет импортирована в C #?

const char* _stdcall z4LLkGetKeySTD(void);

Мне удалось продвинуться так далеко:

   [DllImport("zip4_w32.dll",
       CallingConvention = CallingConvention.StdCall,
       EntryPoint = "z4LLkGetKeySTD",
       ExactSpelling = false)]
   private extern static const char* z4LLkGetKeySTD();

Ответы [ 3 ]

12 голосов
/ 03 февраля 2009

Попробуйте это

   [DllImport("zip4_w32.dll",
       CallingConvention = CallingConvention.StdCall,
       EntryPoint = "z4LLkGetKeySTD",
       ExactSpelling = false)]
   private extern static IntPtr z4LLkGetKeySTD();

Затем вы можете преобразовать результат в строку с помощью Marshal.PtrToStringAnsi (). Вам все еще нужно будет освободить память для IntPtr, используя соответствующий метод Marshal.Free *.

4 голосов
/ 17 августа 2011

Всегда используйте C ++ const char * или char *, а не std :: string.

Также имейте в виду, что char в C ++ является sbyte в C # и беззнаковый символ является байтом в C #.

Желательно использовать небезопасный код при работе с DllImport.

[DllImport("zip4_w32.dll",
   CallingConvention = CallingConvention.StdCall,
   EntryPoint = "z4LLkGetKeySTD",
   ExactSpelling = false)]
 private extern static sbyte* or byte* z4LLkGetKeySTD();

 void foo()
 {
   string res = new string(z4LLkGetKeySTD());
 }
2 голосов
/ 03 февраля 2009

Просто используйте 'string' вместо 'const char *'.

Редактировать: Это опасно по причине, которую объяснил ДжаредПар. Если вы не хотите бесплатно, не используйте этот метод.

...