1. 程式人生 > >使用C#呼叫C++類庫

使用C#呼叫C++類庫

環境:win10+VS2017

過程介紹:

1.使用C++編寫一個動態庫(DLL);

2.將DLL內函式匯出;

3.使用C#進行呼叫;

4.方法呼叫;

5.在VS進行除錯;

1.使用C++編寫簡單的DLL;

1.1建立專案(x64);

 在VS2017中新建->專案->Visual C++->Windows桌面->動態連結庫;

在專案屬性中->常規中選擇無公共語言支援,即不建立託管C++類庫;

1.2新增類和方法;

在該類的.cpp檔案中宣告方法;

自定義一個結構體

在方法的引數中使用結構體,

方法種類:

A類: int TestFunc(int a);

B類:int Funci2(char * c);

C類:char * Funcc(int a);

D類:char Funcc2();

E類: int GetMyIntroStruct(MyIntroStruct* mystr, int* c);

 F類:int SetMyIntroStruct(MyIntroStruct mystr, int index);

 1.3 將方法匯出;

這裡使用extern "C" __declspec(dllexport)標記方法的方式進行匯出;

也可以使用.def檔案進行匯出;

 2 編譯完後,使用Denpends工具,開啟該Dll,檢視標記是否都已匯出;

3.在C#中進行新增和呼叫;

這裡採用DllImport特性標記方式進行匯入

 這裡需要注意型別得對應問題:

引數:  

  C++字串(char *)->C# string

  C++字串(char *)->C# Intptr 

  C++結構圖->C# Intptr

  結構體指標->C# Intptr

  整形指標->C# ref int

在C#類中新增相應結構的自定義結構體(注意結構體的順序),指定結構的記憶體分佈為順序分佈;

 4.方法呼叫;

  對於引數傳入型別:

  A類,B類方法,可以直接呼叫;

  對於Inptr引數的方法,可以在C#內申請記憶體空間傳入C++中進行賦值,並需要對指標釋放;

對於傳出的引數Intptr型別的可以進行資料讀取,將Intptr轉換為string型別:

對於自定義結構體的Intptr指標可以通過對指標偏移獲取資料:

2018.3.26

相關推薦

C# 呼叫AForge操作攝像頭

很多都是C#呼叫window API 傳送SendMessage,實現操作攝像頭,但是C#呼叫window API的時候因為驅動的問題,總是彈出視訊選擇對話方塊,讓人很是無語,看到大牛們有的截獲到了window訊息,然後模擬點選確定按鈕,這是在是不敢恭維啊,還有的大牛根據API原型重寫了,至於我是一隻IT小小

C#呼叫C++的幾種方式

1、  直接呼叫C++類庫中的公共方法 使用DllImport特性對方法進行呼叫,比如一個C++類庫SampleCppWrapper.dll中的公共方法: extern "C" __declspec(dllexport) int __stdcall Add(int n1, int

使用C#呼叫C++

環境:win10+VS2017 過程介紹: 1.使用C++編寫一個動態庫(DLL); 2.將DLL內函式匯出; 3.使用C#進行呼叫; 4.方法呼叫; 5.在VS進行除錯; 1.使用C++編寫簡單的DLL; 1.1建立專案(x64);  在VS2017中新建->專案->Visua

利用C#的反射機制動態呼叫DLL

1、使用Assembly類定義和載入程式集,載入在程式集清單中列出模組,以及從此程式集中查詢型別並建立該型別的例項。 2、使用MethodInfo瞭解方法的名稱、返回型別、引數、訪問修飾符(如pulic 或private)和實現詳細資訊(如abstract或virtual)

2017.10.11 C#呼叫C++ 動態記憶體溢位問題

最近在寫C#呼叫C++ 動態庫的例子,發現使用Stringbuider 時,重複使用時容易造成記憶體溢位的問題,網上查了之後 發現可以使用 Stringbuider .Remove(0, Stringbuider .Length)方法,但是經過測試後並沒有解決問題。 後來經過仔細分析,

C 呼叫 C++

現在有個類Person,其中成員函式分別用於獲取 name 和 age: - GetName() - GetAge() 我們希望可以在 C 程式碼中呼叫 C++ 類的方法。 person.h class Person { public: Person(std::st

C++通過jsoncpp讀寫JSON檔案-json用法詳解

介紹: JSON 是常用的資料的一種格式,各個語言或多或少都會用的JSON格式。 JSON是一個輕量級的資料定義格式,比起XML易學易用,而擴充套件功能不比XML差多少,用之進行資料交換是一個很好的選擇。JSON的全稱為:JavaScript Object Notation ,顧名思義,JSON是用於標記

C++通過jsoncpp讀寫JSON文件-json用法詳解

null 鏈接 reading port 舉例 格式 www. json格式 eno 介紹: JSON 是常用的數據的一種格式,各個語言或多或少都會用的JSON格式。 JSON是一個輕量級的數據定義格式,比起XML易學易用,而擴展功能不比XML差多少,用之進行數據交換是一個

關於 C#呼叫c,將C#的byte[]傳入C的方法和將C的char*向上傳入C#的回撥函式byte[] 的方法

需求         使用C#開發,因某種原因,寫了C庫Dll,使用C#抓圖資料傳入C,將C庫收到的圖片資料向上傳入C#回撥函式。   當前現狀         C#中將byte[]轉換成I

關於 C#呼叫CDll,有回撥函式時,只執行一次回撥函式就直接掛掉 的解決方法

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

VS2017編寫純C以及使用C#呼叫C方法

原博主部落格地址:https://blog.csdn.net/qq21497936 本文章部落格地址:https://blog.csdn.net/qq21497936/article/details/83825098          

C#呼叫C++的P/Invoke工具集

p/Invoke可以使用工具輔助自動生成,以減少混淆 1、官方的支援 http://visualstudiogallery.msdn.microsoft.com/site/search?query=p%2Finvoke&f%5B0%5D.Value=p%2Finvoke&f%5B0%5D.Ty

C#呼叫C/C++動態 封送結構體,結構體陣列

一. 結構體的傳遞 Cpp程式碼    #define JNAAPI extern "C" __declspec(dllexport) // C方式匯出函式   typedef struct       {         int osVersion;  

如何用C語言封裝 C++的C呼叫C++函式)、(C++呼叫C函式)

1、C呼叫C++ 本文給出了一種方法。基本思想是,寫一個 wrapper檔案,把 C++類封裝起來,對外只提供C語言的介面,和 C++i相關的都在  wrapper的實現檔案裡實現。 //------apple.h #ifndef __APPLE_H__ #define

C++呼叫C#(DLL)

一、工作環境 1.平 臺:Windows 10 (64位) 2.軟體環境:VS2013 3.項 目:MFC 二、C++呼叫C#庫(DLL) 1.準備C#庫 (Dll檔案) 1.1 建立C#類庫 1.2 實現C#程式碼 //C#程式碼 using Syste

C++呼叫的建構函式規則

構造方法用來初始化類的物件,與父類的其它成員不同,它不能被子類繼承(子類可以繼承父類所有的成員變數和成員方法,但不繼承父類的構造方法)。因此,在建立子類物件時,為了初始化從父類繼承來的資料成員,系統需要呼叫其父類的構造方法。 如果沒有顯式的建構函式,編譯器會給一個預設的建構函式,並且該預設的建構函式僅僅在沒

C#呼叫C/C++動態,封裝各種複雜結構體。

    現在公司要做一個使用C#程式呼叫C++的一個DLL庫,解析檔案的功能。所以在網上找了一些資料。     一、結構體傳遞 #define JNAAPI extern "C" __declspec(dllexport) // C方式匯出函式 typedef str

c++呼叫c語言的so動態

1.環境  ubuntu14.04   gcc 4.8.4 g++ 4.8.4 2.庫檔案 1)原始碼 //clTest.c int add(int a, int b) { return a + b; } 2)生成庫檔案 cd到clTest.c所

C#呼叫C/C++動態連結(.dll)詳解

第一篇編譯C的動態連線庫 在實際工作中,我們經常會將C語言中的.lib和.h檔案(靜態庫)編譯成動態連線庫.dll檔案(這裡只提供這兩種檔案,沒有完整的工程),以提供給其他語言平臺呼叫。 1,必須有.lib檔案,只有.h檔案是無法編譯動態連線庫的。 2,我使用的是V

c++呼叫c++的so動態2

1.環境  ubuntu 14.04  g++ 4.8.4 2.有類的情況 1)庫檔案 a)原始碼 //cppl2.h class cal { public: cal(); virtual ~