C++调用C# DLL之踩坑记录

C++是非托管代码,C#则是托管代码,无法直接调用
CLR的介绍见CLR简介
MSDN提到了两种非托管-托管的交互技术:CLR Interop和COM Interop
后者要将C# 类库注册为COM组件,本文只探讨CLR,要通过C++ CLR写中间层代码

方式一:组件A(C++ CLR App)->组件B(C# DLL)

方式二:组件A(C++ App)->组件B(C++ CLR DLL)->组件C(C# DLL)

步骤:
1、C++项目属性-“C/C++”-“公共语言运行时支持”-开启CLR
在这里插入图片描述
2、C++代码里通过#using "xxxx.dll"调用C# dll

3、通过using namespace 引入C# dll中的命名空间

4、编写CLR代码,如MyClass里定义了一个加法函数和一个打印函数

#using "mycsdll.dll
using namespace MyClass;
using namespace System;
void main()
{MyClass^ dll = gcnew MyClass();//使用gcnew创建dll中的对象指针int resultInt = dll->Add(a, b);//调用dll对象中的方法String^ resultStr = gcnew String(resultInt.ToString());dll->Print(resultStr);
}

5、把C# dll拷贝至程序运行目录,通过SetDllDirectory设置dll路径不起作用


Debug运行程序,报错

托管调试助手 “LoaderLock”:“DLL“xxxxxxx.dll”正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。”

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\crt\src\vcruntime\dll_dllmain.cpp
281行 result = DllMain(instance, reason, reserved);

解决办法
ctrl+alt+e,“异常”-“Managed Debuggin Assistants“-”LoaderLock”取消勾选


QT中调用C#的Dll

采用方式一:A(C++ CLR App)->C(C# DLL),在Qt项目里开启CLR,编译一堆报错

C:\Qt\Qt5.9.7\5.9.7\msvc2013_64\include\QtCore\qvector.h(73): error C2182: “t”: 非法使用“void”类型
C:\Qt\Qt5.9.7\5.9.7\msvc2013_64\include\QtCore\qvector.h(134): error C2182: “at”: 非法使用“void”类型
... 

Qt的moc跟CLR原生有冲突,见How to use C# objects returned in QT

只能采用方式二,写一个C++ CLR DLL做中转


直接调用C#的exe
实测是不可行的,引用命名空间时提示找不到


不同版本VS的兼容性

如,通过VS2013编译的C++应用程序调用VS2019编译的C# Dll

汇总测试如下:

注:vs2013和vs2019均使用相同的.Net环境

测试条件结果
vs2013 c++ app -> vs2013 c++ clr dll -> vs2013 c# dllpass
vs2013 c++ app -> vs2013 c++ clr dll -> vs2019 c# dllpass
vs2013 c++ app -> vs2019 c++ clr dll -> vs2019 c# dllfailed

说明C# dll的二进制兼容性只跟.Net版本相关,而C++ CLR跟VS(编译器)版本相关

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143893.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

htaccess转换nginx工具

115工具网为您提供htaccess与nginx在线转换,apache伪静态文件转为nginx重写规则,htaccess伪静态规则换nginx,apache RewriteRule转rewrite,apache伪静态文件转nginx重写,apache转nginx重写规则,本工具支持所有的htaccess伪静态、基本的配置规则、重定向等转换为ngin…

Golang开发的OCR-身份证号码识别(不依赖第三方)

身份证号码识别(golang) 使用golang的image库写的身份证号码识别,还有用了一个resize外部库,用来更改图片尺寸大小,将每个数字所在的图片的大小进行统一可以更好的进行数字识别,库名 :“github…

C语言 ——— 编写函数,判断一个整数是否是回文整数

目录 题目要求 代码实现 题目要求 编写一个函数,用来判断一个整数是否是回文整数,如果是回文整数就返回 true ,如果不是就返回 false 举例说明: 输入:121 输出:true 输入:1321 输出&#xf…

怎么把文件生成二维码活码?支持生成多种格式文件的二维码教程

怎么把文件做成二维码分享给其他人预览或下载呢?现在使用二维码来展示或者分享文件的使用场景越来越多,这种方式可以帮助其他人更快的获取文件内容,有利于提升文件传输的效率。二维码可以长期存储文件,获取文件会更加的灵活方便&a…

翻转对00

题目链接 翻转对 题目描述 注意点 给定数组的长度不会超过50000输入数组中的所有数字都在32位整数的表示范围内 解答思路 本题与区间和的个数类似,都是使用归并排序统计满足题意的数量,归并排序后可以有效减少比较的数量归并排序的思路为&#xff1…

心觉:成功学就像一把刀,有什么作用关键在于使用者(一)

Hi,我是心觉,与你一起玩转潜意识、脑波音乐和吸引力法则,轻松掌控自己的人生! 挑战每日一省写作173/1000天 很多人觉得成功学是鸡汤,是没用的,甚至是骗人的 我先保持中立,不知道对不对 我们先…

【Python报错已解决】AttributeError: ‘WindowsPath‘ object has no attribute ‘rstrip‘

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

程序员的宝藏,七大常用Python库!

在Python的广泛应用中,七大常用库扮演着至关重要的角色。这些库覆盖了数据分析、机器学习、科学计算等多个领域,为开发者提供了强大的工具集。以下是这七大常用Python库的详细介绍及其优缺点: 1. NumPy 详细介绍: NumPy是Python的…

在Ubuntu使用VScode配合GDB完成代码调试

想学一下Ubuntu下的vscode代码调试,在网上找了很多博客,发现根本不管用,而且很多都是在Windows下的,与我的需求(使用CMakeLists.txt)不同,根本不能用,研究了一下。并记录。 1.创建C…

浅谈人工智能之Java调用基于Ollama本地大模型

引言 随着人工智能技术的飞速发展,大型语言模型(Large Language Models, LLMs)已成为自然语言处理领域的研究热点。Ollama是一个强大的工具,它使得在本地部署和管理这些大型语言模型变得更加便捷。本文档旨在指导Java开发者如何在…

【C++ Primer Plus习题】16.7

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <vector> #include <…

I/O流(Java)

目录 1. IO概述 1.1 什么是IO 1.2 IO的分类 1.3 IO的流向说明图解 1.4 顶级父类 2. File类 2.1 概述 2.2 构造方法 2.3 常用方法 2.3.1 获取功能的方法 2.3.2 绝对路径和相对路径 2.3.3 判断功能的方法 2.3.4 创建删除功能的方法 2.3.5 目录的遍历 3. 字节流 3…

[Golang] Context

[Golang] Context 文章目录 [Golang] Context什么是context创建context创建根context创建context context的作用并发控制context.WithCancelcontext.WithDeadlinecontext.WithTimeoutcontext.WithValue 什么是context Golang在1.7版本中引入了一个标准库的接口context&#xf…

计算机毕业设计 办公用品管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

如何将扫码提交的数据直接推送到企业微信、钉钉、飞书群聊?详细教程

功能介绍 在草料制作的表单中&#xff0c;填表人扫码填写并提交数据后&#xff0c;这些信息可以立即通过企业微信、钉钉或飞书自动推送到相应的群聊中&#xff0c;实现即时共享和沟通&#xff0c;提升团队协作效率。 设置教程 企业微信 钉钉 飞书

蚂蚁在 RAG 与向量检索上的实践:技术应用与创新分析

引言 在AI技术迅猛发展的背景下&#xff0c;如何有效地处理海量数据成为了技术创新的关键问题。向量数据库和RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术结合&#xff0c;为提升生成式AI应用的准确性和实时性提供了有效的解决方案。本文结合蚂蚁集团在向量…

国外创意二维码应用案例:韩国Cheil特别制作“希望胶带”,帮助寻找失踪儿童!

每年&#xff0c;在全世界都有大量的儿童失踪案件发生。对于父母来说&#xff0c;仅凭一张照片、一张海报要在茫茫人海里找到失踪的孩子&#xff0c;何其艰难&#xff1f; 2020年5月&#xff0c;韩国广告公司Cheil与韩国国家警察局宣布&#xff1a;为寻找长期失踪儿童&#xf…

9.18作业

提示并输入一个字符串&#xff0c;统计该字符串中字母、数字、空格、其他字符的个数并输出 代码展示 #include <iostream>using namespace std;int main() {string str;int countc 0; // 字母计数int countn 0; // 数字计数int count 0; // 空格计数int counto 0;…

面了智谱大模型算法岗,效率贼高!

最近这一两周不少互联网公司都已经开始秋招提前批面试了。不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友解…

Renesas R7FA8D1BH (Cortex®-M85)内部RTC的应用

目录 概述 1 软硬件 1.1 软硬件环境信息 1.2 开发板信息 1.3 调试器信息 2 FSP配置RTC 2.1 配置参数 2.2 RTC模块介绍 3 RTC相关函数 3.1 R_RTC_Open() 3.2 R_RTC_Close() 3.3 R_RTC_ClockSourceSet() 3.4 R_RTC_CalendarTimeSet() 3.5 R_RTC_CalendarTimeGet()…