c#调用c++的DLL的实现方法
作者:故里2130 时间:2023-10-27 05:27:40
C#是托管型代码,创建的对象会自动回收。C++是非托管型代码,创建的对象需要手动回收(有时不手动回收,可能出现内存溢出的问题)。
C#调用C++的方式分为两种:(1)采用托管的方式进行调用;(2)非托管的方式进行调用。
1.采用托管的方式进行调用,就和正常调用c#的dll一样
创建新的c++项目
Function.h中的代码,一个返回两数之和的方法,一个返回字符串的方法
#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中空白不用写
#include "Function.h"
注意:c++的项目一定要选择公共语言运行时支持
在c#的项目中像引用c#的dll一样引用
代码中调用
Function fun = new Function();
int a = fun.menberFuncAdd(1, 2);
string s = fun.say("Hello World");
注意:c#项目一定要选择x86,否则要报错。
运行效果:
2.非托管的方式进行调用
创建新的c++项目
stdafx.h中的代码
// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//
#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++的项目一定要选择公共语言运行时支持
在代码加上
[DllImport("ll.dll")]
public extern static void MessageBoxShow();
注意:c#项目一定要选择x86,否则要报错。
运行结果:
来源:https://blog.csdn.net/u012563853/article/details/123696733
标签:c#,调用,c++,DLL
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java char[]数组转成String类型详细介绍
2021-09-27 22:18:49
![](https://img.aspxhome.com/file/2023/4/90994_0s.jpg)
让C# Excel导入导出 支持不同版本Office
2023-01-11 05:30:53
Spring MVC请求参数与响应结果全局加密和解密详解
2023-02-16 07:04:32
![](https://img.aspxhome.com/file/2023/2/69352_0s.png)
C#如何获取枚举的描述属性详解
2023-02-23 13:49:59
Java线程池高频面试题总结
2023-10-22 02:12:34
Eclipse下基于Java的OpenCV开发环境配置教程
2022-01-30 21:02:54
![](https://img.aspxhome.com/file/2023/4/82424_0s.png)
java解析json数组方式
2023-08-10 17:22:14
![](https://img.aspxhome.com/file/2023/8/58188_0s.png)
Android仿qq顶部消息栏效果
2021-10-28 13:52:57
![](https://img.aspxhome.com/file/2023/1/103901_0s.jpg)
C#中sleep和wait的区别分析
2021-09-11 08:31:25
android通过usb读取U盘的方法
2023-03-14 07:43:25
MybatisPlus中@TableField注解的使用详解
2021-11-01 23:05:35
![](https://img.aspxhome.com/file/2023/0/82040_0s.png)
Android自定义Chronometer实现短信验证码秒表倒计时功能
2022-02-22 10:52:47
![](https://img.aspxhome.com/file/2023/7/95987_0s.jpg)
java配置多个过滤器优先级以及几个常用过滤器操作
2023-12-17 01:52:10
VS2022+unity3D开发环境搭建的实现步骤
2023-02-10 10:13:47
![](https://img.aspxhome.com/file/2023/4/113894_0s.jpg)
java实现代码统计小程序
2022-03-08 23:15:24
详解使用JavaCV/OpenCV抓取并存储摄像头图像
2023-05-08 07:23:31
java自旋锁和JVM对锁的优化详解
2022-03-02 07:05:33
![](https://img.aspxhome.com/file/2023/2/131992_0s.png)
一文带你掌握Spring Security框架的使用
2021-12-02 09:41:00
10道springboot常见面试题
2023-09-02 03:02:22
Android微信Tinker热更新详细使用
2021-08-24 01:58:47
![](https://img.aspxhome.com/file/2023/9/139349_0s.gif)