c#調(diào)用c++的DLL的實(shí)現(xiàn)方法
C#是托管型代碼,創(chuàng)建的對(duì)象會(huì)自動(dòng)回收。C++是非托管型代碼,創(chuàng)建的對(duì)象需要手動(dòng)回收(有時(shí)不手動(dòng)回收,可能出現(xiàn)內(nèi)存溢出的問(wèn)題)。
C#調(diào)用C++的方式分為兩種:(1)采用托管的方式進(jìn)行調(diào)用;(2)非托管的方式進(jìn)行調(diào)用。
1.采用托管的方式進(jìn)行調(diào)用,就和正常調(diào)用c#的dll一樣
創(chuàng)建新的c++項(xiàng)目
Function.h中的代碼,一個(gè)返回兩數(shù)之和的方法,一個(gè)返回字符串的方法
#pragma once #include <string> public ref class Function { public: Function(void); ~Function(void); int menber; int menberFuncAdd(int a,int b); System::String^ say(System::String^ str); }; //.cpp #include "Function.h" Function::Function(void) { } Function::~Function(void) { } int Function::menberFuncAdd(int a,int b) { return a+b; } System::String^ Function::say(System::String^ str) { return str; }
Function.h中空白不用寫(xiě)
#include "Function.h"
注意:c++的項(xiàng)目一定要選擇公共語(yǔ)言運(yùn)行時(shí)支持
在c#的項(xiàng)目中像引用c#的dll一樣引用
代碼中調(diào)用
Function fun = new Function(); int a = fun.menberFuncAdd(1, 2); string s = fun.say("Hello World");
注意:c#項(xiàng)目一定要選擇x86,否則要報(bào)錯(cuò)。
運(yùn)行效果:
2.非托管的方式進(jìn)行調(diào)用
創(chuàng)建新的c++項(xiàng)目
stdafx.h中的代碼
// stdafx.h : 標(biāo)準(zhǔn)系統(tǒng)包含文件的包含文件, // 或是經(jīng)常使用但不常更改的 // 特定于項(xiàng)目的包含文件 // #pragma once #include "targetver.h" #ifdef A_EXPORTS #define DLL_API __declspec(dllexport) #else #define DLL_API __declspec(dllimport) #endif #define WIN32_LEAN_AND_MEAN // 從 Windows 頭文件中排除極少使用的信息 // Windows 頭文件: #include <windows.h> extern "C" DLL_API void MessageBoxShow(); // TODO: 在此處引用程序需要的其他頭文件
dllmain.cpp中的代碼
#include "stdafx.h" BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } #ifdef _MANAGED #pragma managed(push, off) #endif void MessageBoxShow() { MessageBox(NULL, TEXT("Hello World"), TEXT("In a DLL"), MB_OK); } #ifdef _MANAGED #pragma managed(pop) #endif
注意:c++的項(xiàng)目一定要選擇公共語(yǔ)言運(yùn)行時(shí)支持
在代碼加上
[DllImport("ll.dll")] public extern static void MessageBoxShow();
注意:c#項(xiàng)目一定要選擇x86,否則要報(bào)錯(cuò)。
運(yùn)行結(jié)果:
到此這篇關(guān)于c#調(diào)用c++的DLL的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)c#調(diào)用c++的DLL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C# 調(diào)用C++寫(xiě)的dll的實(shí)現(xiàn)方法
- C++調(diào)用C#的DLL實(shí)現(xiàn)方法
- C#調(diào)用C++dll方法步驟
- C++與C#互調(diào)dll的實(shí)現(xiàn)步驟
- C#調(diào)用C++DLL傳遞結(jié)構(gòu)體數(shù)組的終極解決方案
- C++調(diào)用C#的DLL程序?qū)崿F(xiàn)方法
- 基于C#調(diào)用c++Dll結(jié)構(gòu)體數(shù)組指針的問(wèn)題詳解
- C#程序調(diào)用C++動(dòng)態(tài)庫(kù)(dll文件)遇到的坑及解決
- C#程序如何調(diào)用C++?dll詳細(xì)教程
- C++項(xiàng)目中調(diào)用C#DLL的三種方式
相關(guān)文章
C#實(shí)現(xiàn)系統(tǒng)休眠或靜止休眠的方法
這篇文章主要介紹了C#實(shí)現(xiàn)系統(tǒng)休眠或靜止休眠的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05C#實(shí)現(xiàn)Modbus通信功能的示例詳解
Modbus作為一種開(kāi)放且廣泛采用的通信協(xié)議,在實(shí)現(xiàn)設(shè)備間數(shù)據(jù)交換方面發(fā)揮著至關(guān)重要的作用,它不僅支持多種物理層接口(如RS-232,?RS-485,?以及以太網(wǎng)),還因其簡(jiǎn)單易用的特點(diǎn)而被大家所青睞,本文通過(guò)實(shí)際示例介紹如何在C#項(xiàng)目中輕松實(shí)現(xiàn)Modbus通信功能2024-11-11使用C#實(shí)現(xiàn)網(wǎng)頁(yè)內(nèi)容保存為圖片并生成壓縮包
這篇文章主要為大家詳細(xì)介紹了如何使用C#實(shí)現(xiàn)網(wǎng)頁(yè)內(nèi)容保存為圖片并生成壓縮包,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02C# Entity Framework中的IQueryable和IQueryProvider詳解
這篇文章主要介紹了C# Entity Framework中的IQueryable和IQueryProvider詳解,本文使用實(shí)例分析這兩個(gè)接口的內(nèi)部實(shí)現(xiàn),需要的朋友可以參考下2015-01-01