我想在使用DLLImport的C#程序中使用DLL文件。 我有以下功能的DLL:使用DLLImport與char **和float **
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
沒有爲釋放浮**一個單獨的功能。
我在C#中當前的代碼是這樣的:
private static extern int method(string method, ref IntPtr params, Int32 n_params, ref IntPtr res_arr, IntPtr n_res);
我是新的C#(和我的C知識有點欠缺)對我的生活和無法弄清楚如何調用該函數(被面對我的鍵盤兩天)。有人能給我一個例子,說明如何完成這個任務以及如何調用這個函數?
我的主要問題是如何處理char**
和float**
做,我不知道這是否是正確的指針類型的聲明,不知道我應該如何創建和發送我的char**
的功能。
值得注意的是,我可能不會改變在DLL文件什麼。
編輯
這是功能,釋放出結果數組的描述:
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
但得到任何15.0
或3840.0
,還告訴我,要麼我複製或還有別的東西腥當使用指針錯誤。在DLL中的代碼正常工作,因爲有另一個用C語言編寫的程序可以獲得正確的值。這感覺就像我做了一個指針的浮動,而不是它指向的東西。
你不能捏住這個函數,res_arr參數是你的剋星。該DLL分配數組,您不能再釋放它。 C++/CLI包裝器和DLL的源代碼是必需的,因此您可以重新構建DLL並確保它使用與C++/CLI包裝器完全相同的CRT版本。一旦你有了源代碼,你實際上可以修復這個函數,所以它使用了一個你通過的緩衝區而不是自己分配一個緩衝區。 –
@HansPassant爲什麼不呢?似乎有一個單獨的函數來釋放數組。 –
的確,有一個free_results()函數可以調用釋放內存。 –