最近做專案用到了dll,網上介紹了很多,但是真要自己實現起來確實也費了不少功夫,這裡有自己基礎不紮實的原因,也有客觀原因,比如平台呼叫中,好多細節問題如果注意不到,就會得到錯誤的答案。下面是些我寫的一些小測試程式:
code
1//str為輸入引數,outstr為輸出引數
2char
*strtest(
char
*str,
inta, unsigned
char
*outstr);34
[dllimport(
"facelib.dll
", entrypoint ="
strtest
", charset
=charset.ansi, callingconvention
=callingconvention.stdcall)]
5public
static
extern
string
strtest(
string
str,
outint
a,[in,out]
byte
outstr); 67
呼叫函式為:
8private
void
button1_click(
object
sender, eventargs e)931
strtest(s,
outa, sb);
32foreach
(int
i in
sb)33
3637
/**/
////stringbuilder sb = new stringbuilder(256);
38messagebox.show(ss);
39}40
41應該注意的問題:
421. c#編碼方式是unicode,而c裡面是ansi。在傳入字串時,要指定charset為ansi格式,否則會出錯。
432. 傳入char
*用string即可,這方面資料很多,傳出用stringbuilder,原因可以參見csdn上的封送字串,和**函式部分的介紹。這裡要說的是,用stringbuilder來傳出引數時,要保證函式執行完儲存在非託管函式引數中的值不被釋放,比如在原函式char
*strtest(
char
*str,
inta, unsigned
char
*outstr);中如果我把以字串傳入str,然後儲存到char
*outstr中,要用memcpy()或strcpy()來拷貝,而不能直接outstr
=str,這在原函式中執行是沒問題的,但是執行完畢後,不能返回到c#的託管函式。其中原因就是outstr只是乙個str的copy,或者說outstr和str指向了同一塊記憶體,在非託管函式執行完畢後,outstr就銷毀了,自然也不能返回值。
4445
c 函式呼叫引數傳遞
在c 中,引數傳遞的方式是 實虛結合 按值傳遞 pass by value 位址傳遞 pass by pointer 引用傳遞 pass by reference 按值傳遞的過程為 首先計算出實參表示式的值,接著給對應的形參變數分配乙個儲存空間,該空間的大小等於該形參型別的,然後把以求出的實參表示式...
python 呼叫C 常用引數傳遞
環境ubuntu 16.04 python3 1.pycall.c include include struct test 傳遞數值 int valtest int n 傳遞字串 int strtest char pval 傳遞結構體 int structtest struct test data ...
c 呼叫Matlab的引數傳遞
c 呼叫matlab函式時,需要將c 資料型別轉換成matlab資料型別。此時,需要引用mwarray.dll檔案。該程式集包含了與matlab資料交換的類。其中,mwarray類及每個派生類提供建立和訪問 matlab 資料型別的方法。所有類都派生自抽象的 mwarray 類和每個派生類,對映到 ...