C#调用C++的dll方法

本文详细介绍了两种C#调用C++DLL的方法:托管C++DLL库方式和非托管C++DLL库。在托管方式下,创建C++项目并设置支持公共语言运行时,生成DLL后在C#中添加引用并调用。非托管方式则需使用`extern "C"`确保函数导出名正确,C#通过`DllImport`调用导出函数。文中还涉及了参数传递、回调函数等实际应用中的问题。
摘要由CSDN通过智能技术生成

C#调用C++的dll总归可以有两种方法:

1、非托管C++创建的dll库,需要用静态方法调用;

2、直接使用CLR,生成托管C++dll库。

很多时候在项目中需要通过C++调用C#的dll,或者反过来调用。首先明白一个前提:C#是托管型代码。C++是非托管型代码。
托管型代码的对象在托管堆上分配内存,创建的对象由虚拟机托管。(C# )
非托管型代码对象有实际的内存地址,创建的对象必须自己来管理和释放。(C++)

托管C++dll库方式

1、打开VS创建C++项目"C++_CScharp_DLL"

![(https://img-blog.csdnimg.cn/8ebcb30014aa46a589cb4d46a97f0dd8.png)

点击确定之后接着点击下一步:

cjxm2

然后选择应用程序和附加选项:
(https://raw.githubusercontent.com/jinzh1992/-/master/QQ%E6%88%AA%E5%9B%BE20180530091607.png)]

点击完成,C++的项目就新建好了。

2、添加代码文件

右键项目,添加类,如下图所示:

tjdmwj1

添加类之后会打开添加文件对话框,点击添加即可,如下图所示:

在这里插入图片描述

点击确定之后进去下一个对话框,填写文件名Function,如下图所示:

在这里插入图片描述

添加好后会生成h文件和cpp文件,如下图所示:

tjdmwj4

Function类文件代码如下:

//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文件会报错,错误类型如下:

tjdmwj4

这里需要在C++项目里面设置,让动态库受到公共语言运行时的支持。如下图所示:

打开项目属性

tjdmwj6
修改完成后点击项目右键生成DLL,看是否报错,成功结果如下图:
tjdmwj7

3、添加测试程序:

在该解决方案中添加测试程序:
tjcscx1
添加一个C#控制台测试程序:
tjcscx2

添加完后设为启动项:
tjcscx3
添加引用:
在这里插入图片描述

将C++项目添加到C#的项目中:
在这里插入图片描述
4、编写测试代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test
{
   
    class Program
    {
   
        static void Main(string[] args)
        {
   
            Function fun = new 
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧特克_Glodon

很高兴能帮助到您!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值