做什么?

先说一下场景,现在正在开发一个Qt ActiveServer,也就是用一个应用程序去向其他的组件暴露接口,以达到提供服务的目的。

然后新版的框架要提供大部分功能,也就是要重做大部分模块。现在有一个问题,就是有一个用于提供向web发送post请求,获得回执并解析的模块,叫LBD_WebApiInterface

然后现在,我要将这个模块整合到新的Qt ActiveServer里面去,做这个的时候我踩了巨多的坑,做了差不多快一个星期才勉强搞清楚这个怎么做。

其实是很简单的,但是它并不会告诉你错在哪,你只能自己猜谜,这点是最头疼的。

其次,如果有可能,如果是在Windows环境下,我是及其推荐你把C#的DLL改装成COM组件,并注册进系统内,这样可以省去非常非常多的麻烦,不会以至于你在开发的时候跨过和我一样多的坑。

然后我发现CLR这一块完全是一片空白,国内基本上找不到什么中文资料和讨论,真要被这玩意搞得头晕了。

怎么做?

首先我们要知道CLR是什么,知道的 就知道了,不知道的你也只能自己去百度了。

实际上,CLR语言就是个C#语言和C++语言的结合体,具体语法我这里不会过多阐述,只说应用

因为我这里大部分的类都是以单例的形式对外暴露的,具体是否需要使用单例可以视情况而定,总之我这里就要用单例:

注:其中这个LBD_WebApiInterface的namespace就是来自我需要调用的那个C#的DLL

这个类里面我只是需要获得一个单例,返回我们在这个CLR项目中,由C#DLL生成的单例,仅此而已。

甚至不需要一个类去包裹,当然了最好还是有一个类去管理gc,不然我也不知道会发生什么。

然后就是写接口了,写一个DLL 对外暴露的类:TeachInfo

这个宏的目的是为了复用这个头文件,这样就可以在调用方直接引用这个头文件而不需要修改了

如果想要这个宏正常工作的话,则需要源文件在调用这个头文件的上方加入宏定义

#ifndef _IWEB_H
#define _IWEB_H // 通过宏来控制是导入还是导出
#ifdef _IWEB
#define WEB_API __declspec(dllexport)
#else
#define WEB_API __declspec(dllimport)
#endif
//..代码块
#endif

先来看下转换数据类型的头文件Trans.h



因为System::Sring类型相当于是托管类型,不能直接转换成std::string,所以必须要听过msclr\marshal_cppstd.h里面提供的这个marshal_as函数进行转换

这里有一个比较坑的点,就是你必须要把这个

#include <msclr/gcroot.h> //gcroot
#include <msclr\marshal_cppstd.h>

这两行 放在

using namespace msclr::interop;

的前面,否则会报错:

"*"不能再类型"IServiceProvider"上使用此间接寻址。

除此之外

#include "windows.h"

这一行的引用和上述引用的位置也可能导致类似的问题,这里就不细说了

然后我们来看一个简单的示例

注:CLR类型需要在源文件的开头引用

#include "pch.h"

头文件,这个头文件将决定哪些内容会被编译,如果你不包含这个头文件的话就不会编译了,然后就有可能报错LNK2019

然后就是,除了头文件之外,你的源文件中的每一个函数都需要一个WEB_API的标记,否则调用方可能会报错LNK2019

来看下调用方

调用方的话 其实也比较简单,我之前犯了一个错误害得我搞了好久,都没能解决问题

首先需要知道的一点是,#pragma comment(lib,"xxx.lib")这条宏和你在vs中对项目的设定是不一样的,如果你在VS中设定的比如链接库地址,但是你#pragma comment(lib,"xxx.lib")的位置是错误的,编译器会优先尝试导入你写的这条宏,这会导致

LNK 2019

然后还有一点就是,你是可以用#pragma comment(lib,"xxx.lib")引用这个lib文件,但是如果这个lib依赖的库不在应用程序的根文件夹下,有可能这个应用程序编译之后会有两个问题

1.LNK2019

2.ActiveServer 注册失败

我只提供一个范例,具体问题我不再分析

【大型软件开发】开发日志(五).net框架与C++的融合:CLR——C++调用C#的DLL的更多相关文章

  1. 【大型软件开发】浅谈大型Qt软件开发(一)开发前的准备——在着手开发之前,我们要做些什么?

    前言 最近我们项目部的核心产品正在进行重构,然后又是年底了,除了开发工作之外项目并不紧急,加上加班时间混不够了....所以就忙里偷闲把整个项目的开发思路聊一下,以供参考. 鉴于接下来的一年我要操刀这个 ...

  2. Qt开发Active控件:如何使用ActiveQt Server开发大型软件的主框架(2)

    Qt开发Active控件:如何使用ActiveQt Server开发大型软件的主框架 注:本文更多地是带着如何去思考答案,而不是纯粹的放一个答案上来,如果你需要直接看到完整的答案,请直接看实例和最后的 ...

  3. 【大型软件开发】浅谈大型Qt软件开发(二)面向未来开发——来自未来的技术:COM组件。我如何做到让我们的教学模块像插件一样即插即用,以及为什么这么做。

    前言 最近我们项目部的核心产品正在进行重构,然后又是年底了,除了开发工作之外项目并不紧急,加上加班时间混不够了....所以就忙里偷闲把整个项目的开发思路聊一下,以供参考. 鉴于接下来的一年我要进行这个 ...

  4. 【大型软件开发】浅谈大型Qt软件开发(三)QtActive Server如何通过COM口传递自定义结构体?如何通过一个COM口来获得所有COM接口?

    前言 最近我们项目部的核心产品正在进行重构,然后又是年底了,除了开发工作之外项目并不紧急,加上加班时间混不够了....所以就忙里偷闲把整个项目的开发思路聊一下,以供参考. 鉴于接下来的一年我要进行这个 ...

  5. 使用 CodeIgniter 框架快速开发 PHP 应用(五)

    原文:使用 CodeIgniter 框架快速开发 PHP 应用(五) 简化 HTML 页面和表格设计这一章介绍了又一个节约你的时间而且使你的代码更具安全性和逻辑性的领域.第一,我们将会介绍创建视图的各 ...

  6. 敏捷开发(五)- 框架SCRUM内容

    本文主要是为了检测你对SCRUM的了解和使用程度,通过本文你可以检测一下     1.你们的SCRUM项目中各个角色是否合格,    2.SCRUM上面需要的会议是否有遗留,会议过程是否正确    3 ...

  7. 微软软件开发技术二十年回顾-.NET框架篇

    六. .NET框架篇 .NET是微软自从发布Windows 3.0以来最为激动人心的新技术,是微软战略上为下一个十年对服务器和桌面软件工程的第一步,是微软的一场世纪大豪赌.对于.NET,微软的定义是, ...

  8. [转]3天搞定的小型B/S内部管理类软件定制开发项目【软件开发实战10步骤详解】

    本文转自:http://www.cnblogs.com/jirigala/archive/2010/10/07/1845275.html 2010-10-07 21:39 by 通用C#系统架构, 5 ...

  9. 测试开发中Django和Flask框架

    Python测试开发中Django和Flask框架 为了更好地阐述这个问题,我们把开发一个应用的过程进行类比,往往开发一个应用(web应用.系统应用)跟建造房子的过程一样,需要先打地基,搭好骨架,然后 ...

  10. 快速全面了解QT软件界面开发技术

    快速全面了解QT软件界面开发技术     目录 前言 一. 学习QT可能的目的是什么? 只想体验一下QT? 当前的项目选择了用QT. 为将来做QT技术储备. 二. QT的核心技术优势是什么? QT在软 ...

随机推荐

  1. VMware虚拟机开机黑屏解决方法

    挂起时可以看到显示,但是开机就黑屏 解决方法: 命令提示符,鼠标右键点击"命令提示符",弹出菜单之后选择"以管理员身份运行" 在命令提示符窗口中输入" ...

  2. JavaScript:七大基础数据类型:字符串string

    在JS中,字符串类型的数据,有三种表达方式,但是无一例外都是需要引号扩起来的: 单引号'hello' 双引号"hello" 反引号`hello` 注意: 因为JS没有字符类型,这一 ...

  3. Less-1(GET字符型)

    union联合注入(方法一) 进入靶场 按照要求提交一个id:http://192.168.121.131/sqli/Less-1/?id=1 数据库执行语句:select * from news w ...

  4. 企业应用架构研究系列二十五:IdentityServer4 认证服务搭建

    IdentityServer4 更新了开源协议,曾经想替换它,不在使用IdentityServer4 ,但是后来,研究来研究去,发现IdentityServer4 的功能实在是强大,设计体系完整,随着 ...

  5. GraalVM和Spring Native尝鲜,一步步让Springboot启动飞起来,66ms完成启动

    简介 GraalVM是高性能的JDK,支持Java/Python/JavaScript等语言.它可以让Java变成二进制文件来执行,让程序在任何地方运行更快.这或许是Java与Go的一场战争? 下载安 ...

  6. DVWA系列3:CSRF

    DVWA系列3:CSRF 前言 CSRF(Cross-site request forgery),即跨站请求伪造,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法. 比如说,用户 ...

  7. MySQL数据库技术实战

    MySQL数据库技术实战   一,安装mysql 很早之前就知道mysql提供了一套数据库样本(github地址),用于测试你的应用程序和数据库服务器. 今天分享下使用过程并将他发布到了码云,以便于同 ...

  8. 【随笔记】NDK 编译开源库 jsoncpp

    下载并解压源码 wget https://github.com/open-source-parsers/jsoncpp/archive/refs/tags/1.9.4.tar.gz -O jsoncp ...

  9. 在日报、读后感、小说、公文模版、编程等场景体验了一把chatGPT

    总结/朱季谦 在日报.读后感.小说.公文模版.编程等场景体验了一把chatGPT,说下体会. 昨天经过一顿操作猛如虎的捣鼓,终于在Mac笔记本上将chatGPT的访问环境搭建了起来,忍不住立马开始玩起 ...

  10. vulnhub靶场之VENOM: 1

    准备: 攻击机:虚拟机kali.本机win10. 靶机:Venom: 1,下载地址:https://download.vulnhub.com/venom/venom.zip,下载后直接vbox打开即可 ...