1. 程式人生 > >C#呼叫C++ DLL的完整方法(解決了各種坑,Win7下測試可用)

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#呼叫CDll有回撥函式時只執行一次回撥函式就直接掛掉 的解決方法

錯誤         直接當機,如下圖:           錯誤原因        回撥函式宣告原因,跟堆疊有關係  

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