1

DLLImport を使用して C# プログラムで DLL ファイルを使用しようとしています。DLL に次の関数があります。

int method(char* method, char** params, int n_params, float** res_arr, int* n_res);

関数呼び出しは次のようになります。

method   = "method1"
char**   = {"param1=1", "param2=2"}
n_params = 2
res_arr  = the DLL function allocates an array and points this to it
n_res    = the DLL function sets to the number of results

float** を解放するための別の関数があります。
C# での私の現在のコードは次のとおりです。

private static extern int method(string method, ref IntPtr params, Int32 n_params, ref IntPtr res_arr, IntPtr n_res);

私は C# が初めてで (C の知識が少し不足しています)、一生この関数を呼び出す方法を理解できません (2 日間キーボードをいじっています)。誰かがこれを行う方法と関数を呼び出す方法の例を教えてもらえますか?

私の主な問題は、char**andfloat**をどうするかです。それが宣言内の正しいポインター型であるかどうかわかりません。また、 my を作成char**して関数に送信する方法がわかりません。

注目に値するのは、DLL ファイル内の何も変更しない可能性があるということです。

EDIT
これは結果配列を解放する関数の説明です:

free_results(float* res_arr)

EDIT2 メソッドを呼び出すことができるようになり、値が返されました。私の問題は、フロート値へのアクセスに問題があるように見えることです。示唆されているように、私はMarshal.Copy()このように使用しています:

[DllImport("libs\\myDll.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int method(string method, string[] params, Int32 n_params, out IntPtr res_arr, ref int n_res);

IntPtr res_arr = IntPtr.Zero;  
int n_res = 0;
string[] s = new string[] { "param1" };  

method("analyze", s, s.Length, out res_arr, ref n_res);  

float[] f_res = new float[n_res];
Marshal.Copy(res_arr, f_res, 0, n_res);

問題は、浮動小数点ベクトルでゴミの値しか得られないように見えることです。たとえば、あるケースでは、またはの100.0いずれかを取得する必要があります。これは、コピー時にポインターを間違って使用しているか、何か怪しいものがあることを示しています。正しい値を取得する C で記述された別のプログラムがあるため、DLL 内のコードは正常に機能しています。ポインターが指すものではなく、ポインターのフロートを作成しているように感じます。15.03840.0

4

1 に答える 1

2

これは私の最初の問題を解決したコードです(Hans Passantが提案したように):

[DllImport("libs\\myDll.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int method(string method, string[] params, Int32 n_params, out IntPtr res_arr, ref int n_res);

IntPtr res_arr = IntPtr.Zero;  
int n_res = 0;
string[] s = new string[] { "param1" };  

method("analyze", s, s.Length, out res_arr, ref n_res);  

float[] f_res = new float[n_res];
Marshal.Copy(res_arr, f_res, 0, n_res);

私の 2 番目の問題は、float 配列が意味のない値を与えるというものでした。DLL には、method(...)処理する値を持たせるために を使用する前に呼び出す必要がある別の関数があります。その呼び出しを追加した後、すべてが完全に機能しました。

于 2013-10-16T09:40:09.257 に答える