為使用者定義的結構指定自定義封送處理
可以為傳遞到非託管函式或從非託管函式返回的結構和類的字段指定自定義封送處理屬性。通過向結構或類的字段中新增 marshalas屬性可以做到這一點。還必須使用 structlayout 屬性設定結構的布局,還可以控制字串成員的預設封送處理,並設定預設封裝大小。
示例 3
本示例說明如何為結構指定自定義封送處理屬性。
請考慮下面的 c 結構:
c/c++ code
typedefstruct
taglogfont
logfont;
在 c# 中,可以使用 structlayout 和 marshalas 屬性描述前面的結構,如下所示:
c# code
//logfont.cs
//compile with: /target:module
using
system;
using
system.runtime.interopservices;
[structlayout(layoutkind.sequential)]
public
class
logfont
有關 structlayout 屬性的語法的更多資訊,請參見 structlayoutattribute 類。
然後即可將該結構用在 c# **中,如下所示:
//pinvoke.cs
//compile with: /addmodule:logfont.netmodule
using
system;
using
system.runtime.interopservices;
class
platforminvoketest
else
", handle.toint32());
else
console.writeline(""
, handle.toint64());
//delete the logical font created.if(
!deleteobject(handle))
console.writeline(
"can't delete the logical font");}}
}
執行示例
c30a0ae5
**討論
在前面的示例中,createfontindirect 方法使用了乙個 logfont 型別的引數。marshalas 和 in 屬性用於限定此引數。程式將由此方法返回的數值顯示為十六進製制大寫字串。
參考:http://topic.csdn.net/u/20090106/10/cd130dad-4d61-4bad-bb97-5d786fee9b26.html
C 呼叫c Dll結構體陣列指標的問題
c 呼叫c dll檔案是一件很麻煩的事情,首先面臨的是資料型別轉換的問題,相信經常做c 開發的都和我一樣把學校的那點c 底子都忘光了吧 語言特性類 網上有一大堆得轉換對應表,也有一大堆的轉換例項,但是都沒有強調乙個更重要的問題,就是c 資料型別和c 資料型別佔記憶體長度的對應關係。如果dll檔案中只...
C 呼叫c Dll結構體陣列指標的問題
c 呼叫c dll檔案是一件很麻煩的事情,首先面臨的是資料型別轉換的問題,相信經常做c 開發的都和我一樣把學校的那點c 底子都忘光了吧 語言特性類 網上有一大堆得轉換對應表,也有一大堆的轉換例項,但是都沒有強調乙個更重要的問題,就是c 資料型別和c 資料型別佔記憶體長度的對應關係。如果dll檔案中只...
C 呼叫C dll 結構體引數傳遞問題
1 最近做專案遇到,c 呼叫c dll裡的函式需要傳遞結構體引數,發現這個並不是簡單的在c 裡定義相應的結構體就可以的,下面以乙個例子來說明解決的辦法,c 中的函式和結構體如下 uint msec set igr gen cfg int port,igr gen t igr gen typedef ...