7

この 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();
4

3 に答える 3

12

これを試して

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

次に、Marshal.PtrToStringAnsi()を使用して、結果を文字列に変換できます。適切なMarshal.Free*メソッドを使用して、IntPtrのメモリを解放する必要があります。

于 2009-02-03T18:12:07.910 に答える
4

std::string ではなく、常に C++ の const char* または char* を使用してください。

また、C++ の char は C# の sbyte であり、unsigned char は 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());
 }
于 2011-08-17T02:08:20.703 に答える