1. 程式人生 > >C#專案中呼叫C++生成的Dll 入門教程

C#專案中呼叫C++生成的Dll 入門教程

1、首先建立一個C++ 的dll 專案(Dll_Cpp)並生成,會得到這三個檔案:

Dll_Cpp.dll   //動態庫

Dll_Cpp.lib   //靜態庫

Dll_Cpp.h    //標頭檔案

其中Dll_Cpp.h的程式碼如下:

// 下列 ifdef 塊是建立使從 DLL 匯出更簡單的
// 巨集的標準方法。此 DLL 中的所有檔案都是用命令列上定義的 DLL_CPP_EXPORTS
// 符號編譯的。在使用此 DLL 的
// 任何其他專案上不應定義此符號。這樣,原始檔中包含此檔案的任何其他專案都會將
// DLL_CPP_API 函式視為是從 DLL 匯入的,而此 DLL 則將用此巨集定義的
// 符號視為是被匯出的。
#ifdef DLL_CPP_EXPORTS
#define DLL_CPP_API __declspec(dllexport)
#else
#define DLL_CPP_API __declspec(dllimport)
#endif

DLL_CPP_API int add(int a,int b); //實現a+b

其中Dll_Cpp.cpp的程式碼如下:

// Dll_Cpp.cpp : 定義 DLL 應用程式的匯出函式。
//

#include "stdafx.h"
#include "Dll_Cpp.h"

// 這是匯出函式的一個示例。
DLL_CPP_API int add(int a, int b)
{
    return a+b;
}

2、建立一個CLR專案:Dll_CSharp

(1)將第1步中的三個檔案copy到Dll_CSharp 專案的目錄下:和Dll_CSharp.h同一個資料夾。

(2)將Dll_Cpp.h新增到Dll_CSharp專案中,現在Dll_CSharp專案的目錄結構是這樣的:


(3)在Dll_CSharp.h 檔案中做如下修改。 新增:

 #include<vcclr.h>                   //這是clr專案必須新增的標頭檔案

 #include "Dll_Cpp.h"                 //這是託管的dll的標頭檔案

 #pragma comment(lib," Dll_Cpp.lib") //這是需要託管的dll的靜態庫檔案

在生成的Class1(這個類名可以隨便改)中新增需要託管的函式程式碼。

如我們需要託管 add(int a, int b);這個函式,那麼Dll_CSharp.h的程式碼如下:
// Dll_CSharp.h

#pragma once
#include <vcclr.h>                 //這是clr專案必須新增的標頭檔案
#pragma comment(lib,"Dll_Cpp.lib") //這是需要託管的dll的靜態庫檔案
#include "Dll_Cpp.h"               //這是託管的dll的標頭檔案

using namespace System;

namespace Dll_CSharp {
	//這裡面編寫的方式和C++一樣
	//這個類可以在C#中呼叫。若需要託管一個類,那麼就可以在這裡新增
	public ref class Class1 
	{
	public:
		//這個函式就可以在C#中呼叫,在它的定義中,呼叫了需要託管的dll中的函式
		int AddCSharpClass1(int a, int b);
	
	};
}
那麼Dll_CSharp.cpp的程式碼如下:
// 這是主 DLL 檔案。

#include "stdafx.h"
#include "Dll_CSharp.h"

namespace Dll_CSharp {//一定要在這個名稱空間裡寫

	int Class1::AddCSharpClass1(int a, int b) 
	{
		return add(a,b);
	}
}

(4)生成Dll_CSharp 這個專案會生成 Dll_CSharp.dll這個檔案

(5)測試:

         (a)首先建立一個C#的程式,如一個控制檯專案testDll_CSharp

         (b) 將 Dll_Cpp.dll、 Dll_Cpp.lib 和Dll_CSharp.dll這三個檔案copy到testDll_CSharp專案目錄下(和Program.cs同一目錄)

         (c)新增對Dll_CSharp.dll的引用


(d)編輯Program.cs的程式碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
using Dll_CSharp; //在這裡引入dll
namespace testDll_CSharp
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 1;
            int b = 2;
            Class1 clas = new Class1();
            int dst = clas.AddCSharpClass1(a,b);//呼叫
            Console.Write(dst);
            Console.Read();
        }
    }
}

(e)編譯執行:


這裡面還涉及到型別轉換的問題,在使用的時候要注意。

ps:其實還有更簡單的方法,就是直接在CLR專案中使用C++寫程式碼,然後編譯成DLL供C#呼叫。但這樣做會使得原始碼很容易被反編譯。

相關推薦

C#專案呼叫C++生成Dll 入門教程

1、首先建立一個C++ 的dll 專案(Dll_Cpp)並生成,會得到這三個檔案: Dll_Cpp.dll   //動態庫 Dll_Cpp.lib   //靜態庫 Dll_Cpp.h    //標頭檔案 其中Dll_Cpp.h的程式碼如下: // 下列 ifdef 塊是建

筆記:在C#程式呼叫C++編寫的類

假設C++中有一個類c定義如下:class c { private: int count; public: void add(int n); int get(); }; 其中add函式定義如下:void C:: add(int n){ count +

java呼叫C/C++編寫的生成的動態連線庫dll檔案介面的簡單例子

1、首先用java編寫一個簡單類 public class Hello { public native void sayHello(); static { System.loadLibrary("HelloDll"); } public static void

[轉]在C#呼叫C語言函式(靜態呼叫Native DLL,Windows & Microsoft.Net平臺)

原文:https://blog.csdn.net/yapingxin/article/details/7288325   對於不太瞭解.Net的人,如果想要了解.Net,我必須給他介紹P/Invoke。P/Invoke是什麼呢?簡單地說,就是在.Net中呼叫原生代碼(Native code)的一

通過cmake在Android呼叫c語言,且生成so檔案

1、  新建JniUtils類實現native方法   2、  在build中執行clean project 再rebuild project 生成class檔案。 注意:最新版本的AndroidStudio中classes檔案的路徑是在\app\build\inter

Qt程式呼叫C#編寫的dll

最近在使用Qt整合以前的一個工具時,發現有幾個dll是採用C#寫的,當然可以把C#寫的dll重新在Qt中用C++寫,雖然這是幾個C#寫的dll的函式介面使用的引數都比較簡單,只用了int和string型別等,但在函式內部卻還使用了C#的專用一些類,如果重寫還是很麻煩,就查找了

C#呼叫C++的dll的引數為指標型別的匯出函式(包括二級指標的情況)

一:首先什麼是IntPtr 先來看看MSDN上說的:用於表示指標或控制代碼的平臺特定型別。這個其實說出了這樣兩個事實,IntPtr 可以用來表示指標或控制代碼、它是一個平臺特定型別。對於它的解釋,這個哥們寫的比較好:It's a class that wraps a

C++呼叫C# DLL

首先寫個Com的DLL 工程如下 Security.cs程式碼 Com 介面程式碼 工程生成配置  選擇為Com互註冊 編譯 後生成 XGSharpLib.dll檔案 下面編寫C++測試程式 這樣 我們就可以在C++程式 呼叫C# .net自帶的加密演算法了

VB.net呼叫C\C++ 的DLL

只需要宣告一句話,比如呼叫mfc_Calc.dll中的calc函式 Public Declare Function calc Lib "mfc_Calc" (ByValaAs Integer, ByV

在Linux使用VS Code編譯除錯C++專案(gcc/g++、Makefile入門、vs code)

最近專案需求,需要在Linux下開發C++相關專案,經過一番摸索,簡單總結了一下如何通過VS Code進行編譯除錯的一些注意事項。 關於VS Code在Linux下的安裝這裡就不提了,不管是CentOS還是Ubuntu,如果不懂且搜Q足夠的情況下,你會解決的。 一. 前置知識——gcc/g++的編譯連結過程

使用ctype在python呼叫c

之前在python中呼叫c++是通過命令列呼叫的,引數傳遞是使用檔案IO的形式,所以會特別慢 現在用ctypes,引數傳遞傳的只是記憶體中的指標,這就很舒服 現在來總結下如何使用cytpes在python中呼叫c (Ubuntu系統下)   首先寫一個test.c的原始碼 int a

MATLAB呼叫.C程式

需要把 .c  變成 MATLAB 可以識別的程式碼 在MATLAB中進入 .c 檔案所在的當前目錄,然後  mex  BP_General_C.c 。該路徑下生成BP_General_C.mexa64檔案,即為MATLAB可以呼叫的檔案。 mex 

C++專案引入Lua(AlphaGo使用的方案)

       最近大火的AlphaGo,其中的deepmind已經開源,可以到github中下載https://github.com/deepmind/lab·,網上還有一個基於Python開源AlphaGo,那個不是google的。通

python呼叫 C#動態連結庫問題記錄

程式[摘自https://blog.csdn.net/LTG01/article/details/80700513]  import clr clr.FindAssembly("PythonNetTest.dll") ## 載入c#dll檔案 from PythonNetTest import *

C#(.Net)呼叫Sql sever漢字字串顯示為?問號

利用Sql語言,向資料庫中匯入‘C語’,結果在檢查的時候,發現如上圖所示。 網路上,很多人說是編碼問題,但是都沒給出具體的解決方案,最終用這種方法解決了! 把上圖中需要儲存漢字字串的型別變為 nvarchar(**) **為任意整數,同時用insert加入資料時,要在字串前加入N,

關於在electron呼叫C++動態庫的經驗總結

前言       electron以nodejs作為底層執行環境,所以自然而然就想到了他能否呼叫C++編寫的動態庫,恰好我最近在做一個關於使用electron呼叫dll的專案,也就花了一點時間去了解和實踐,這期間走

如何在C呼叫C++?

C++部分的程式碼: jpeg_npp.h #ifdef __cplusplus extern "C" { #endif int jpeg_npp(char* data, int data_size); #ifdef __cplusplus } #endif jp

【lua】C 函式呼叫Lua函式時,對於lua_pcall使用的困惑

最近在學習使用Lua,也通過基本的語法知識完成了公司的一個關於配置檔案引數合法性檢查的小任務。雖然任務完成了,但對於一些函式的呼叫目的還是搞不明白,這兩天再次重看了Manual Reference,稍微梳理出了一點眉目,記錄在此。 首先看一段小小小程式 fun

IDEA編輯器下 JNI Java呼叫C\C++語言的詳細方法步驟

Mac OS 上進行github的配置 註冊GitHub賬號,直接去官網註冊即可 建立github.io 在自己的主頁,點選”New repository”,即可新建一個版本庫 安裝或更新

擴充套件Python之在Python呼叫C編寫的函式模組

目錄 編寫Python擴充套件 1. 建立應用程式碼 2. 根據樣板編寫封裝程式碼 2.1 包含Python標頭檔案 2.2 為每一個模組函式新增形如PyObject* *Module_func()* 的封裝函式