使用C 呼叫C 的dll,這個dll輸出的是個二維陣列,我C 這邊怎麼接收呢?

時間 2021-06-28 10:50:27

1樓:西井丶

你的方法要out出第一維度多長, 第二維度多長, 猜測你的方法會返回乙個double*

[DllImport("abc.dll")]

private

static

extern

double

*GetDoubles

(blahblahblah

,out

intfirst

,out

intsecond

);然後你需要

double[,] result = new double[first, second]

呼叫這個GetDoubles方法拿到乙個double* ptr

最後 Unsafe.Copy(ref result[0, 0], ptr) 就可以完成複製了

上邊這句只能複製乙個值。。請看下邊的方法

先計算出要複製多少bytes: uint length = (uint)(first * second * sizeof(double));

最後 Unsafe.CopyBlockUnaligned(ref Unsafe.As(ref result[0, 0]), ref Unsafe.

As(ref *ptr), length) 就可以完成複製了

如果你的.NET版本沒有Unsafe這個類的話, 就用System.Buffer + unsafe完成, 如下:

fixed

(double

*resultPtr

=result

)最後囉嗦一句, 記得釋放掉你拿到的double* ptr

C 呼叫C DLL函式,一般怎麼封裝這個DLL?

沒錯,用C CLI。完全可以滿足你的需要。我的C 類中使用了openCV與Qt類。使用C CLI封裝後可以在C 中呼叫無壓力。參考 Keep Learning 這個是最簡單的,可以在他的類上做改動,加入你的類的指標,和相關介面函式。如果有人dll中的類要傳遞Mat型別,可以看這個 http mili...

C 的dll庫,採用動態呼叫更好還是靜態呼叫更好?

單純的淫 動態 shared library,從英文本面意思很明確了,如果你的dll還要給別的pe模組使用,你就用動態dll,這樣不用所有模組都各自包含乙個dll,大家公用乙個dll就行,反正用的時候loadlibrary一下就行。去如果確實就你自己的程式使用,就靜態吧,打包省事兒點。 井底的bee...

c ,如何按照不同的要求呼叫標準庫sort函式排序?

Larry Sean sort函式的第三個引數是可選的,可以填你自定義的比較函式,返回bool型別。這個比較函式會當成小於號用。這樣就可以寫三個比較函式分別比較類中不同的值。如果從小到大就用小於號,從大到小就用大於號。至於怎麼設計,怎麼選擇排哪個,判斷一下調不同的函式就好了。好了,道理都講清楚了,加...