C++通过DLL调用C#代码

C#调用C++的dll方法 C#调用C++的dll总归可以有两种方法: 1、非托管C++创建的dll库,需要用静态方法调用; 2、直接使用CLR,生成托管C++dll库。 阅读详情

本文将介绍C++中通过DLL来调用C#代码。

首先建立C#的“类库”工程CShapeDLL。

然后输入如下代码:

//C++通过DLL调用C#代码
//http://blog.youkuaiyun.com/morewindows/article/details/8678431
//By MoreWindows( http://blog.youkuaiyun.com/MoreWindows )
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CShapeDLL
{
    public class CMyAddClass
    {
        private int m_nNumber1;
        private int m_nNumber2;
        public int Number1
        {
            set { m_nNumber1 = value; }
            get { return m_nNumber1; }
        }
        public int Number2
        {
            set { m_nNumber2 = value; }
            get { return m_nNumber2; }
        }
        public int AddFunc()
        {
            return m_nNumber1 + m_nNumber2;
        }
    }

    public class CMyWriteLine
    {
        private string m_strText;
        public string Text
        {
            set { m_strText = value; }
            get { return Text; }
        }
        public void WriteLineFunc()
        {
            Console.WriteLine(m_strText);
        }
    }
}
// By MoreWindows( http://blog.youkuaiyun.com/MoreWindows )

这里有两个类,一个是MyAddClass类,是用来做加法运算的,另一个是CMyWriteLine,用来输出文本的。

然后以C++控制台程序为例,C++代码如下:

//C++通过DLL调用C#代码
//http://blog.youkuaiyun.com/morewindows/article/details/8678431
#using "CShapeDLL\\CShapeDLL\\bin\\Debug\\CShapeDLL.dll"
//#using "CShapeDLL\\CShapeDLL\\bin\\Release\\CShapeDLL.dll"
#include <stdio.h>
#include <conio.h>
using namespace CShapeDLL;
int main()  
{  
	printf("    C++通过DLL调用C#代码\n");          
	printf(" - By MoreWindows( http://blog.youkuaiyun.com/morewindows/article/details/8678431 ) -\n\n");   

	CMyWriteLine ^ writeLineClass = gcnew CMyWriteLine;
	writeLineClass->Text = "使用C# 的CMyWriteLine示范";
	writeLineClass->WriteLineFunc();
	writeLineClass->Text = "By MoreWindows (http://blog.csdn.com/MoreWindows)";
	writeLineClass->WriteLineFunc();
	writeLineClass->Text = "http://blog.youkuaiyun.com/morewindows/article/details/8678431";
	writeLineClass->WriteLineFunc();

	printf("\n   ----------------------------------   \n");

	CMyAddClass ^ addClass = gcnew CMyAddClass;
	addClass->Number1 = 3;
	addClass->Number2 = 5;
	printf("使用C# 的CMyAddClass示范\n");
	printf("%d + %d = %d\n", addClass->Number1, addClass->Number2, addClass->AddFunc());
	getch();
	return 0;
}
//By MoreWindows( http://blog.youkuaiyun.com/MoreWindows )

编译,出错。提示如下:

fatal error C1190: 托管目标代码需要“/clr”选项

好吧,修改下,在“属性”->“配置属性”->“常规”->“公共语言运行库支持”中选取“公共语言运行库支持(/clr)”。如下图所示(图片访问不了?请访问http://blog.youkuaiyun.com/morewindows/article/details/8678431)。

 

再编译,又出错!提示如下:

1>正在编译...

1>cl: 命令行error D8016 :“/MTd”和“/clr”命令行选项不兼容

1>项目: error PRJ0002 : 错误的结果2 (从“e:\Program Files\Microsoft Visual Studio 9.0\VC\bin\cl.exe”返回)。

好吧,再修改下,“属性”->“配置属性”->“C/C++”->“代码生成”->“运行时库”中选取“多线程 DLL (/MD)”。如下图所示(图片访问不了?请访问http://blog.youkuaiyun.com/morewindows/article/details/8678431)。

 

再编译,成功了。运行下,又出错了——“应用程序发生异常未知的软件异常(0xe0434f4d),位置为 0x7c812fd3“。如下图所示(图片访问不了?请访问http://blog.youkuaiyun.com/morewindows/article/details/8678431)。

 

这个怎么解决了,很简单,这是因为EXE程序没能加载到DLL文件导致的,将CShapeDLL.dll拷贝到EXE程序所在目录下,再运行,成功了。结果如下图所示(WinXP及Win7均可以运行):

 

转载请标明出处,原文地址:http://blog.youkuaiyun.com/morewindows/article/details/8678431

欢迎关注微博:http://weibo.com/MoreWindows



 

Unity中C#调用C++封装的dll,接收并传递结构体数组指针(类和结构体) 项目所需,需要在unity中调用C++封装的dll,需要传递结构体数组。C++中封装的函数的参数为结构体指针。在网上找了一下博客,然后结合MSDN上的C#编程参考手册,找到了方法。 DLL的创建 这里创建了一个.h文件,声明了很简单两个结构体和一个类,类中还声明了一个Vector6D的数组,没有使用更复杂的结构体。 //StructTest.h #ifndef _STRUCTTEST_H_ #define _STRUCTTEST_H_ #include <iostream> #include & 阅读详情

相关推荐

C#调用C++的dll文件

目录 1.C#调用C++(类)的dll文件 C#端的代码: C++端的代码: 被调用的类的头文件 被调用类的实现SampleCppClass.cpp 封装成dll的头文件 封装成dll的实现 2.使用委托调用 1.C#调用C++(类)的dll文件 C#端的代码: using System; using System.Collections.Generic; using S...

xianyunxiaohe的博客 1465

C++代码封装成dll供C#中调用、调用dll无可用源

C#工程不可以直接调用C++的头文件和Lib库等 所以在程序中C#需要调用的现象,先将C++的东西封装成动态链接库,再调用 若调用dll时显示:无可用源调用,说明导入的DLL路径不对。 静态库和动态库区别: 静态库和动态库是两种共享程序代码的方式,它们的区别是:静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加

有塔耶奥多的专栏 1万+

C#项目中调用C++生成的Dll 入门教程

如何在C#中调用C++生成的DLL文件

K.U.N. Guo的专栏 6422

C++调用C#的dll

C++调用C#的dll的三个方法: 1. 如果C++使用clr语法编译:  通过#using(比如 #using "xxx.dll")引入C#的dll,在程序中调用C# dll中的变量或函数(采用正确的访问托管对象,即:使用 '^',而不是'*')。 2. 如果C++没有使用clr语法编译: 先用managed C++将C# dll重新封装以后,供C++调用。 3. 将C# dll封装

我编程,我快乐 2435

C++调用C#的DLL实现方法

SwfDotNet是C#编写的,这是个特别好的读写Swf文件的库。本文讲述了在C++项目中,怎么让C++调用C#的DLL动态链接库文件。 具体的实现步骤如下: 一、创建C# DLL,需要指定应用类型为“类库”,代码: namespace CSLib { public class Class1 { private string name; public string Name { get { return name; } set { name = "Your Name:

西门子200 SMART与博图WinCC通讯全攻略:从PC Access到S7-200协议避坑指南

本文详细解析了西门子S7-200 SMART PLC与博途WinCC上位机通讯的两种主流方案:基于PC Access SMART的OPC通讯和利用博途内置S7-200协议驱动直连。文章深入对比了两种架构的优缺点、配置步骤,并提供了从网络层到软件层的深度排错指南与性能优化建议,帮助工程师高效、稳定地实现系统集成。

gg901的博客 810

c++ 调用c#dll (2种方式,com组件和clr工程)

c++ 调用c#dll ,com组件和clr工程两种方式分别实现成功

qq_43525389的博客 9130

Android蓝牙开发—经典蓝牙和BLE(低功耗)蓝牙的区别

      最近在做蓝牙开发,刚接触时傻傻的分不清经典蓝牙和低功耗蓝牙的区别,一直用开发低功耗蓝牙的方法去连接经典蓝牙设备,最后当然是一直连接不上了。在此记录下经典蓝牙和低功耗蓝牙的区别和联系。 Android中的蓝牙         说到Android中的蓝牙,大家听到的可能有蓝牙1.0、蓝牙2.0、蓝牙3.0、蓝牙4.0之类的以数字结尾的蓝牙版本号,而实际上,在最新的标准中,已经不再使用数...

zqf_888的博客 4万+

C++编译成DLL在C#中调用的方法示例代码

建立C++项目时选择生成DLL库C++示例代码 dllmain.cpp 生成test.dll #include "ClassHeader.h"   //类定义(声明)头文件extern "C" _declspec(dllexport) ClassName* createClass(){  //创建类对象,返回指针 return new ClassName();}extern "C" _

Flutter 跨平台技术研究 600

拆解一个800G光模块:手把手带你认识里面的MT插芯和光纤阵列(FA)

本文详细拆解了800G光模块中的关键组件MT插芯和光纤阵列(FA),揭示了并行光学技术如何实现高速数据传输。通过显微镜下的精密观察,展示了MT插芯的高精度构造和光纤阵列的连接奥秘,同时解析了高精度研磨工艺对光信号传输的重要性。这些微型组件是高速收发模块实现800Gbps带宽的核心技术。

weixin_30839881的博客 1546

WiFi基本概念(六)(L-STF,L-LTF)

L-STF它由10个OFDM symbol(1,0,1,0,1,0,1,0,1,0)构成,每个symbol是0.8us,GI是0.2us,总计10us。Symbol的长度是正常长度的1/4,因此称为Short training field,主要用于快速进行信号检测,信号同步,自动增益控制,接收天线选择(Diversity Selection)。 由于symbol长度是正常的1/4,子载波的宽度是正常的4倍,能进行初略的信道估计,其使用了-24, -20, -16, -12, -8, -4, 4, 8, 1

reekyli的专栏 6861

C#调用C++ dll代码

1.新建项目选(Visual C++ ——>windows桌面程序——>动态链接库(DLL))如图。 (这里最好不要在其他项目中新建DLL项目否则会后很多未知问题。) 2.打开第一个DIllNewTest.cpp 写上如下代码 extern "C" _declspec(dllexport) int XXXX(int a, int b) { return a + b...

qq_30312145的博客 317

使用MATLAB结合EasySpin进行ESR模拟的详细步骤及示例代码

安装EasySpin:确保你已经安装了EasySpin工具箱,它可以帮助你进行ESR模拟。你可以从EasySpin的官方网站(https://easyspin.org/)下载并安装。准备实验数据:将实验得到的EPR数据整理成合适的格式,一般包含磁场(Magnetic Field)和信号强度(Intensity)两列。进行模拟:使用EasySpin的函数对单线态氧自由基和超氧自由基进行模拟。调整参数:通过调整模拟参数,使模拟得到的峰型和峰位置与实验数据尽可能匹配。导出数据。

AI的内部世界的博客 2004

C++代码封装成dll供C#中调用

C#工程不可以直接调用C++的头文件和Lib库等 所以在程序中C#需要调用的现象,先将C++的东西封装成动态链接库,再调用 若调用dll时显示:无可用源调用,说明导入的DLL路径不对。 静态库和动态库区别: 静态库和动态库是两种共享程序代码的方式,它们的区别是:静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到...

zhangke1985的专栏 1745

【YOLO系列】YOLOv8详解:模型结构、损失函数、训练方法及代码实现

YOLOv8是Ultralytics团队2023年推出的高效目标检测框架,在速度与精度平衡、多任务支持和易用性方面实现突破。模型采用改进的CSPDarknet主干网络、C2f模块和SPPF加速结构,结合PAN-FPN特征融合和解耦检测头设计,支持目标检测、实例分割和关键点检测任务。创新性地使用CIoU定位损失、Focal Loss置信度损失和动态样本分配策略,显著提升检测性能。实验表明,YOLOv8较前代模型mAP提升5-10%,在TensorRT加速下可达1000FPS,提供5种尺寸灵活选择,成为实时目标

一碗白开水一 2779

DRM遇到的实际问题及领悟(3)

DRM遇到的实际问题及领悟(3)

phmatthaus的专栏 635

C++ 通过DLL调用C#代码

本文将介绍C++中通过DLL来调用C#代码。 首先建立C#的“类库”工程CShapeDLL。 然后输入如下代码: [csharp] view plain copy //C++通过DLL调用C#代码   //http://blog.youkuaiyun.com/morewindows/article/details/8678431   //By Mor

cnicfhnui的博客 8732

Linux系统中u-boot启动流程分析(详解)

代码部分,具体如下;

嵌入式技术开发 1991

非托管C++代码调用C#编写的dll方法

<br />非托管C++代码调用C#编写的dll方法<br />CLR VIA C#这本书里面的内容,在网上好像很少关于这方面的内容,贴出来以后留着看。<br />C#调用C++编写的dll,一般都是直接用dllimport,这个资料很多。C++调用C#编写的dll,一般方法都是先用托管C++将C#的dll进行一次封装,然后由非托管C++调用封装好的dll。<br />CLR VIA C#在讲寄宿和应用程序域的内容时,提供了一个非托管C++直接调用的方法。原理就是,在非托管代码中手动启动CLR加载应用程序域

mxj_2001382的专栏 1348

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: 微软实习生日记 第二篇 微软实习生招聘指导手册
下一篇: Windows系统CPU内存网络性能统计第二篇 CPU CPU整体使用率
MoreWindows
MoreWindows 《白话经典算法》、《秒杀多线程》作者 《白话经典算法》、《秒杀多线程》作者 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄15年 2万+粉丝 157原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值