首页 > 编程语言 >C#调用C++dll

C#调用C++dll

时间:2023-06-05 22:35:31浏览次数:33  
标签:C# MyDLL C++ dll int using

C#调用C++dll的方法和步骤

其他分享涉及到的概念和方法对于像我这样比较菜的选手看起来比较费劲并且很难抓住重点,这里我总结了一段时间的研究成果供初学者救济之用,简单明了。

工具/原料

 

  • VS2008

方法/步骤

 

  1. 新建项目->Visual C++->Win32项目 MyDLL
    注意:C++编写的dll一般是不能直接拿来C#调用,需要先新建个C++的工程把dll里的方法重新封装成可被C#外部调用的函数。

C#调用C++dll_编译程序

  1. MyDLL.cpp里的代码如下:
extern "C"  _declspec(dllexport)int add(int a ,int b)  
{  
int sum=a+b;
return sum;
}

  1. 注意:函数前一定要加extern "C"  _declspec(dllexport),可被外部引用

  2. 项目->属性->常规->公共语言运行库支持->公共语言运行库支持(/clr)

  3. F5编译程序,在Debug文件夹中找到生成MyDLL.dll目标文件备用

END

方法/步骤2

 

  1. 新建项目->Visual C#->控制台应用程序 dllConsoleApplication1

  2. 将步骤1生成的MyDLL.dll文件copy到dllConsoleApplication1工程的根目录下

  3.  
1. Program.cs代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;   //必须添加,不然DllImport报错
 
namespace dllConsoleApplication1
{
    class CPPDLL
    {
        [DllImport("MyDLL.dll", CharSet = CharSet.Ansi)] //引入dll,并设置字符集
        public static extern int add(int a ,int b);
    }
    class Program
    {
        static void Main(string[] args)
        {
            int sum=CPPDLL.add(3, 4);
        }
    }
}
  1. 4
    编译程序,在程序中加断点,查看函数的计算结果

  2. 5
    到这里,C++dll里的方法已经在C#里调用成功了。



标签:C#,MyDLL,C++,dll,int,using
From: https://blog.51cto.com/u_4018548/6420102

相关文章

  • vscode技巧----屏蔽python类型错误提示
    有一段python代码如下:fromwin32com.shellimportshellfromwin32com.shellimportshellcon结果出现类型错误的提示:在网上搜了一些方法都没有解决,而实际运行代码时,又不会出错,所以干脆就把这个告警提示屏蔽掉即可,如下所示:fromwin32com.shellimportshell......
  • Semaphore 类 的使用理解C#
    示例下面的代码示例创建一个信号量,其最大计数为3,初始计数为零。该示例启动五个线程,这会阻止等待信号量。主线程使用Release(Int32)方法重载将信号量计数增加到其最大值,从而允许三个线程进入信号量。每个线程使用Thread.Sleep方法等待一秒,以模拟工作,然后调用Release()方法......
  • C#中调用c++的dll具体创建与调用步骤,亲测有效~ (待验证)
    使用的工具是VS2010哦~其他工具暂时还没试过我新建的工程名是my21dll,所以会生成2个同名文件。接下来需要改动的只有画横线的部分下面是my21dll.h里面的。。。下面的1是自动生成的不用动,或者也可以不要,因为只是一个宏而已下面可以做相应修改。下面的2是自动生成的类,我没用就注释掉了......
  • 【loj3396】novel(AC自动机维护文本串子串的匹配信息)
    设当前询问的串为\(s_i\)记为\(t\)。考虑\(r\)右移,维护每个\(l\)对应的\(g(l,r)\)和\(\max_{l}\frac{g(l,r)}{r-l+1}\)即可。最基本的观察是:当\(r\)右移后,考虑\(t_{1..r}\)在AC自动机上匹配到的点\(p\),那么对于\(p\)的任意祖先(包含\(p\))\(u\),都会给\(l\leq......
  • DataTemplateSelector介绍
    DataTemplateSelector可以帮助我们实现动态选择数据绑定的模版,如通过ListView+DataTemplateSelector实现微信朋友圈或聊天列表效果。Github已有聊天效果图  喜欢阅读代码请直接移步:https://github.com/nishanil/Xamarin.Forms-Samples/tree/master/DataTemplateSelector本文通过......
  • C#中的垃圾回收
     ......
  • C# 线程池ThreadPool的用法简析
    什么是线程池?为什么要用线程池?怎么用线程池?1.什么是线程池?.NETFramework的ThreadPool类提供一个线程池,该线程池可用于执行任务、发送工作项、处理异步I/O、代表其他线程等待以及处理计时器。那么什么是线程池?线程池其实就是一个存放线程对象的“池子(pool)”,他提供了一些基本方......
  • post请求方式 - 抖音生活服务 使用restTemplate而不使用httpClient
    publicstaticStringdoPostForJson(Stringurl,Stringjson,StringbyteAuthorization){RestTemplaterestTemplate=newRestTemplate();logger.info("restTemplateinvokepostmethod.url:[{}],json:[{}]",url,json);long......
  • 【网络基础】用了 TCP 协议,数据一定不会丢吗?
    1  前言TCP是一个可靠的传输协议,那它一定能保证数据不丢失吗?这次,就跟大家探讨这个问题。2  数据包的发送流程首先,我们两个手机的绿皮聊天软件客户端,要通信,中间会通过它们家服务器。大概长这样。但为了简化模型,我们把中间的服务器给省略掉,假设这是个端到端的通信。且为了......
  • net core+mediatr+EF实现事件触发
    参考杨中科的教程1.先添加接口usingMediatR;namespaceNetOptions.Entities;publicinterfaceIDomainEnvent{voidAddNotification(INotificationnotification);IEnumerable<INotification>GetNotifications();voidClearNotifications();}2.添加抽......