西西軟件下載最安全的下載網(wǎng)站、值得信賴的軟件下載站!

首頁(yè)編程開(kāi)發(fā)C#.NET → Visual Studio中.Net 引用C++的DLL報(bào)錯(cuò)解決方案

Visual Studio中.Net 引用C++的DLL報(bào)錯(cuò)解決方案

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2013/4/4 20:51:39字體大小:A-A+

作者:西西點(diǎn)擊:0次評(píng)論:1次標(biāo)簽: DLL

  • 類型:DLL和OCX大。8.6M語(yǔ)言:中文 評(píng)分:2.5
  • 標(biāo)簽:
立即下載

.Net 開(kāi)發(fā)中如果使用外部DLL,一般引用進(jìn)來(lái)就可以了,最多引用前將DLL注冊(cè)一下。下面是我所遇到的問(wèn)題及解決的方法,希望能對(duì)大家有用。

1.在Visual Studio中引用C++寫(xiě)的DLL時(shí)報(bào)以下錯(cuò)誤

未能添加引用,請(qǐng)確保此文件可訪問(wèn)并且是一個(gè)有效的程序集或COM組件。

手工注冊(cè)該DLL也報(bào)錯(cuò):模塊已加載,但找不到入口點(diǎn)DLLRegisterServer, 請(qǐng)確保XXX為有效的DLL或OCA文件,然后重試。

經(jīng)查詢發(fā)現(xiàn)C++編譯的DLL并不一定能被C#直接使用,需通過(guò)C#中的DllImport直接調(diào)用這些功能。

代碼如下所示:

在程序開(kāi)始時(shí)使用以下語(yǔ)句注冊(cè)方法。

[DllImport("Enc7481.dll", EntryPoint = "_Enc7481_Set_Encoder", ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
 private extern static void _Enc7481_Set_Encoder(UInt16 intDirection, Int32 lngValue);

在程序中直接調(diào)用就可以了:

_Enc7481_Set_Encoder(0, 0);

2.找不到對(duì)應(yīng)的方法

使用以上的程序后,參考廠商所給的C++程序卻報(bào)找不到對(duì)應(yīng)的入口點(diǎn),也就是函數(shù)名稱不對(duì)。C++DLL編譯后函數(shù)名稱會(huì)有變化,需使用eXeScope.exe查詢具體的函數(shù)名稱。

3.報(bào)內(nèi)存錯(cuò)誤:

嘗試讀取或?qū)懭胧鼙Wo(hù)的內(nèi)存。這通常指示其他內(nèi)存已損壞。造成這種錯(cuò)誤的情況很多,一般來(lái)說(shuō)是對(duì)函數(shù)的使用錯(cuò)誤造成的。對(duì)于我的程序來(lái)說(shuō)是因?yàn)樾枰紫日{(diào)用_Enc7481_Init()來(lái)初始化。

4.類型錯(cuò)誤

終于將以上錯(cuò)誤都解決,程序可以運(yùn)行了,但發(fā)現(xiàn)取到的數(shù)據(jù)總是不對(duì),再次檢查,發(fā)現(xiàn)原來(lái)是數(shù)據(jù)類型不對(duì)造成的。

VC++中主要字符串類型為:LPSTR,LPCSTR, LPCTSTR, string, CString, LPCWSTR, LPWSTR等
但轉(zhuǎn)為C#類型卻不完全相同,只有數(shù)據(jù)類型對(duì)應(yīng)正確才能取得正確的數(shù)據(jù)。

類型對(duì)照:

BSTR ---------  StringBuilder

LPCTSTR --------- StringBuilder

LPCWSTR ---------  IntPtr

handle---------IntPtr

hwnd-----------IntPtr

char *----------string

int * -----------ref int

int &-----------ref int

void *----------IntPtr

unsigned char *-----ref byte

5.結(jié)構(gòu)體參數(shù)的傳遞

對(duì)于結(jié)構(gòu)體參數(shù)需要在C#中建立對(duì)應(yīng)的結(jié)構(gòu)體,并用Marshal類將結(jié)構(gòu)體轉(zhuǎn)換為指針地址傳給C++函數(shù),取得數(shù)據(jù)后再根據(jù)指針地址取得對(duì)應(yīng)的結(jié)構(gòu)。

HREE structThree = new THREE();
            IntPtr ptrThree = Marshal.AllocHGlobal(Marshal.SizeOf(structThree));
            Marshal.StructureToPtr(structThree, ptrThree, false);
            _Enc7481_Get_ThreeEncoder2(ptrThree);
            structThree = (THREE)Marshal.PtrToStructure(ptrThree, typeof(THREE));

    dll文件
    (300)dll文件
    小編為您整理了文件合集下載和文件修復(fù)工具下載大全,方便解決您日常出現(xiàn)的一些問(wèn)題。簡(jiǎn)介的全稱是,中文叫做動(dòng)態(tài)鏈接文件。在操作系統(tǒng)中,對(duì)于程序執(zhí)行是非常重要的,因?yàn)槌绦蛟趫?zhí)行的時(shí)候,必須鏈接到文件,才能夠正確地運(yùn)行。而有些文件可以被許多程序共用。因此,程序設(shè)計(jì)人員可以利用文件,使程序不至于太過(guò)巨大。但是當(dāng)安裝的程序越來(lái)越多,文件也就會(huì)越來(lái)越多,如果當(dāng)你刪除程序的時(shí)候,沒(méi)有用的文件沒(méi)有被刪除的話,久而久之就造成系統(tǒng)...更多>>

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門(mén)評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(1)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)