台灣最大程式設計社群網站
線上人數
2546
 
會員總數:246323
討論主題:189853
歡迎您免費加入會員
討論區列表 >> C# >> C#引用C++封裝的DLL的問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
C#引用C++封裝的DLL的問題
價值 : 30 QP  點閱數:2745 回應數:5
樓主

Yvonne
門外漢
0 13
201 11
發送站內信

現在我需要引用C++封裝的DLL檔,此文件廠商說可以引用但沒有提供相關C#使用的範例
我在資料型別轉換時不確定哪些是對的或錯的,但就是會提示錯誤訊息
"嘗試讀取或寫入受保護的記憶體。這通常表示其他記憶體已損毀。"
我爬文的結果是可能參數或屬性傳遞不正確的原因!
c++函式文件說明

參數:
libraryName [in]
p11 [out]
c++使用範例說明

c#自行編寫如下:

本篇文章發表於2012-12-19 16:14
1樓
作者回應

Yvonne
檢舉此回應
24行更正
rc = Basic.InitLibrary(Test.MODULE_LIBRARY,ref p11);

rc = Basic.InitLibrary(Test.MODULE_LIBRARY,out p11);

進入此函式相當於將初始化完的p11丟回來,但不知道該寫ref還是out,還是有哪些地方寫錯~
請各位大大指點一下!感激不盡~
本篇文章回覆於2012-12-19 16:20
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
不錯的參考

展翔研究室
捐贈 VP 給 展翔研究室 檢舉此回應
會出現記億體錯誤的主要問題是你引用的是C/C++的DLL, 它的int只佔2 bytes, 而C#的int則是佔4 bytes, 所以如果你將C/C++函式編碼成同樣是int, 傳遞的參數長度超過, 當然會出現記憶體錯誤例外, 解決之道是C/C++函式中的int, 在C#中的P/Invoke編碼函式中要寫成 short, 以此類推, 我例出幾例如下:

Data Type C/C++ C#
int 2 bytes 4 bytes
本篇文章回覆於2013-07-19 23:45
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
最有價值解答

展翔研究室
捐贈 VP 給 展翔研究室 檢舉此回應
我舉出幾例如下:

Data Type -- C/C++ -- C#
int -- 2 bytes -- 4 bytes
long -- 4 bytes -- 8 bytes
long long -- 8 bytes -- n/a


n/a:not applicable(there is no long long in C#)
本篇文章回覆於2013-07-19 23:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

學無海
檢舉此回應
請問版主後來是怎麼解決的?
因為目前跟版主遇到一樣問題~謝謝
本篇文章回覆於2021-03-09 13:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

春天
檢舉此回應
4樓
嘗試讀取或寫入受保護的記憶體。這通常表示其他記憶體已損毀
大多是function signature有問題
如果你有文件或.h檔就對照著類型去改
有文字相關的參數就注意CharSet 是Unicode還是Ansi [DllImport("yourLibrary", CharSet = CharSet.Auto)]
有指針的大多是用IntPtr
有數字的就注意一下到底是幾個byte比如是32byte,C#就用int or System.Int32,若是unsigned 32 byte 那就uint or System.UInt32
本篇文章回覆於2021-03-10 16:19
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.