C#呼叫C++ DLL的完整方法(解決了各種坑,Win7下測試可用)
由於C#直接訪問USB裝置的能力較弱,而C++在這方面則強大許多。因此,考慮通過C++實現讀寫USB裝置,C#呼叫該DLL介面的方式。這個過程中,上網查了一些資料,但是自己動手,仍然會出現這樣或者那樣的問題,因此,記錄下大體步驟,以便後續他人或者自己可以參考。
主要步驟如下:
1 C++ dll宣告匯出函式,程式碼如下(注意不同語言之間由於函式呼叫方式不一致,這裡一定要新增 __stdcall):
extern "C" DLL_API int __stdcall Fun1(int type) { return 1; } extern "C" DLL_API int __stdcall Fun2() { return 2; } extern "C" DLL_API int __stdcall Fun3(WCHAR* serialNO) { wcscpy(serialNO,L"1234656-245奧迪"); return 3; }
2 C++ Dll 編寫模組定義檔案,使得函式名稱不會因為C++的函式名稱修飾而改變導致找不到函式。
LIBRARY Test.Dll
EXPORTS
Fun1
Fun2
Fun3
3 C++ Dll 工程配置使用def模組定義檔案。右鍵 專案屬性-->連結器-->模組定義檔案 輸入模組定義檔案的名稱即可。然後編譯生成Dll。
4 C# 增加呼叫宣告,類似如下:
public class TEST_DLL_API { [DllImport("Test.dll", EntryPoint = "Fun1")] public static extern int Fun1(); [DllImport("Test.dll", EntryPoint = "Fun1")] public static extern int Fun2(); [DllImport("Test.dll", EntryPoint = "Fun1")] public static extern int Fun3(byte[] str); }
5 如果報DllImport找不到的類似錯誤,增加
using System.Runtime.InteropServices; 即可解決該問題。
6 呼叫C#宣告C++中的介面,程式碼如下(注意C++ WCHAR* 與C# 中 string之間的轉換方法):
private void button1_Click(object sender, EventArgs e) { byte[] serialNo = new byte[64]; int result = 0; result = TEST_DLL_API.Fun1(); result = TEST_DLL_API.Fun3(serialNo); result = TEST_DLL_API.Fun2(); string str = Encoding.Unicode.GetString(serialNo); }
7 執行測試,win7 32位程式應該能夠直接成功(把Test.Dll檔案拷貝到C#工程bin目錄下對應的Debug目錄下 bin\Debug)。我是在win7 64位程式除錯C#程式,會報 C#呼叫dll提示"試圖載入格式不正確的程式"的錯誤,解決方法如下:
點選專案屬性,生成 屬性頁,把目標平臺Any CPU 設定為 x86 即可( bin\x86\Debug 目錄)。
接著把 Test.Dll 檔案拷貝到C#工程bin目錄下對應的Debug目錄下。再次除錯執行即大功告成。
8 當然了問題7有更好的解決辦法。對於64位系統下呼叫C++的Dll,可以不設定CPU為x86,我們編譯64位的C++ Dll,然後C#使用64位的Dll即可以除錯執行。
如果各位在使用過程有其它問題,歡迎討論。。。
相關推薦
C#呼叫C++ DLL的完整方法(解決了各種坑,Win7下測試可用)
由於C#直接訪問USB裝置的能力較弱,而C++在這方面則強大許多。因此,考慮通過C++實現讀寫USB裝置,C#呼叫該DLL介面的方式。這個過程中,上網查了一些資料,但是自己動手,仍然會出現這樣或者那樣的問題,因此,記錄下大體步驟,以便後續他人或者自己可以參考
c#呼叫python的四種方法(嘗試了四種,只詳細講解本人成功的後兩種,其餘方法只列出,詳細用法請自行谷歌百度)
一、使用c#,nuget管理包上下載的ironPython安裝包 嘗試後發現,對引用了numpy等第三方庫的python程式碼,會報找不到模組xxx的錯誤,上網查證後發現此問題基本難以解決 二、使用c++程式呼叫python檔案,然後將其做成動態連結庫
Django model,QuerySet 序列化成json的方法(解決了500 (INTERNAL SERVER ERROR)的問題)
問題描述:ajax從前端向後端請求資料,後端的檢視函式需要把資料轉換成json格式傳過去。但是一直報下面這個500的錯誤: 經過研究發現,拼湊json串的時候將一組queryset格式的資料拼進去了,如下: {'otherlog_success': 57772481L
名稱空間(解決了為什麼使用using namespace std;的疑惑)
名稱空間是用來組織和重用程式碼的編譯單元。NameSpace(名字空間),是為了解決命名衝突的問題而引入的概念。通過使用 namespace xxx(就是xxx使用的範圍),你所使用的庫函式或變數就是在該名字空間中定義的,這樣一來就不會引起不必要的衝突了。C++標準程式庫中的所有識別符號都被定義於一
Pycharm啟用方法(2016年11月14號親測可用)
現在網上有很多PyCharm的啟用方法,但是都是一看摸不到頭腦,一時間很難進行啟用,經過網上很多次的尋找,尋找到一種較為穩定且快捷的方法,筆者在win7平臺以及Ubuntu下進行了實驗,發現是很好用的,具體步驟如下:help——Register——如下介面: 安裝到輸
Android之完美退出方法(2.1-2.2-2.3SDK版本測試通過)
為什麼要寫這篇文章? 因為網上有很多種退出方法,可是實際上很多方法都不通用(在某個版本下可用,到了另一個版本就不行),或者方法的實際效果根本就和其描述不符(也不知道那些發帖的人測沒測試過)。但我們的需求又確實存在。在某些情況下,我們需要在應用中開啟多個Activity,但如
Impala整合hive(填了各種坑之後總結出來的文件)
1 環境準備 1.1 伺服器配置 1.2 環境配置 1.3 Impala安裝包下載(不能使用yum命令的情況下) 1.4 Impala安裝包下載(可以使用yum命令的情況下) 2 下載安裝依賴包(必須安裝
關於 C#呼叫C庫Dll,有回撥函式時,只執行一次回撥函式就直接掛掉 的解決方法
錯誤 直接當機,如下圖: 錯誤原因 回撥函式宣告原因,跟堆疊有關係
C#呼叫C++的DLL錯誤解決方法
一、報錯如下:無法載入DLL"**.dll":找不到指定的模組(異常來自HRESULT:0x8007007E) 此時若可以確定此dll就在bin目錄下,則說明是此dll呼叫別的dll,這時下載depends軟體,檢視此dll缺少的dll。
C#呼叫C++的dll 常見錯誤解決方法
C# 和 C/C++ 互動可以使用輔助工具: Depends:檢測.exe/dll檔案中的依賴庫有哪些; PInvoke從功能上來說,只支援函式呼叫,在被匯出的函式前面一定要新增extern “C來指明匯出函式的時候使用C語言方式編譯和連結的,這樣保證函式定義的名
Qt中純C++項目發布為dll的方法(超詳細步驟)
exe 程序 con ostream address 只需要 include free windows 眾所周知,我們可以將C++項目中的類以及函數導出,形成 .dll 文件,以供其他程序使用,下面將說明Qt環境下的使用方法。 首先創建共享庫,步驟如下:
C#呼叫C++DLL方法
最近使用海康的某平臺SDK,但是提供的demo沒有C#版本,只有C++的,在轉換過程中遇到很多問題,簡單記錄一下. 目錄 1.引數為基本型別,例如 int,float,char等。 [C++] void fun(int value); v
Qt中純C++專案釋出為dll的方法(超詳細步驟)
目錄 一般建立方法 匯出普通函式的方法&呼叫方法 匯出類及其成員函式的方法&呼叫方法 眾所周知,我們可以將C++專案中的類以及函式匯出,形成 .dll 檔案,以供其他程式使用,下面將說明Qt環境下的使用方法。 首先建立共享庫,步驟如下:
C++ 基礎(四)C# 呼叫 C++的DLL: [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]
C# [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] 關於這部分內容,往後我會詳細解釋。 https://docs.microsoft.com/zh-cn/dotnet/api/syste
結構體指標作函式引數(C# 呼叫C++ 的DLL)
1、C++結構體定義: #pragma pack(1) struct Person { #define Count_favoriteNumbers 6 int id; fl
C++ 呼叫C#工程的 dll , 互相呼叫方法
很多時候在專案中需要通過C++呼叫C#的dll,或者反過來條用。 首先明白一個前提:C#是託管型程式碼。C++是非託管型程式碼。 託管型程式碼的物件在託管堆上分配記憶體,建立的物件由虛擬機器託管。(C# ) 非託管型程式碼物件有實際的記憶體地址,建立的物件必
C#呼叫DLL的幾種方法,包括C#呼叫C\C++\C#DLL
C# 語言有很多優點,越來越多的人開始使用它來程式設計。但是,C#還有一些不足,如對不少的底層操作是無能為力的,只能通過呼叫Win32 DLL 或C++等編寫的DLL;另外,一般認為C#程式的保密性不夠強,因為它容易被Reflector 反編譯而得到部分原始碼,所以需要使用混合程式設計加強C#程式的保密性,而
C#呼叫C++dll方法和注意事項
在實際C#開發專案中,存在如下兩種情況 C#呼叫第三方庫,而第三方庫是使用C++編寫的; 牽涉到專案原始碼保密,C#程式碼容易被反編譯,因此抽取核心演算法部分使用C++編寫 這時候就涉及C#託管程式碼與C++非託管程式碼互相呼叫。 本文介紹C#呼叫C++的方法以及在C#
關於使用C#呼叫C++生成的動態連結庫(DLL檔案)
使用C++的開啟一張圖片,C++的程式。在C++新建專案的應用設定裡面選擇DLL,圖片如下 將顯示單張圖片的C++程式碼複製到建立檔案的.CPP檔案下面,然後除錯。 程式碼如下: // Cpp_cshape.cpp : 定義 D
C# 呼叫 C++ 寫的Dll 遇到的問題(呼叫DLL 自動退出) win32已停止工作
1 回撥函式正確呼叫一次之後,程式自動在回撥函式前面加 [UnmanagedFunctionPointer(CallingConvention.Cdecl)] 進行修飾 如下所示: [UnmanagedFunctionPointer(CallingConvent