2024/1/1更新
变质胶水不建议用(容易出现跨IDE不兼容),写点C式dll不香吗。
参考别的方式调用dll:C#调用DLL的几种方法,包括C#调用C\C++\C#DLL
旧内容已过时
下面的东西不用看了,看了浪费时间。(不想改单纯是因为已经打算不用CSDN了,因此文章内容不再维护
【本文章发布于CSDN,未经个人同意不得转载】
【原文地址:【托管C++(CLI)】【简单示例】C#调用C++/CLI(以DLL形式调用)】
因为操作太多了,纯文本描述实在是不方便,直接来个图文说明
①、【一个平淡无奇的C++空项目】
②、【设置该C++项目的项目属性】
“符合模式”这个东西我也不知道是干啥的,但我也不怎么感兴趣,翻车的时候再来看看好了
③、【写一个C++的托管类(CLI),调用之前写的C++类,然后生成DLL文件】
简单说明下这个CLI的语法:
①、托管类要用ref声明,并且添加public声明用于外部项目的使用;
②、托管类里头的公有部分的复杂数据类型统统都是C#的数据类型例如System::Collections::Generic::List啥的(当然也可以是自己写的其他的托管类),并且那些数据类型都必须使用引用^;
③、在cpp文件里生成个C#的数据对象是使用gcnew的而不是new的;
④、C++的类/数据结构是不能出现在公有部分中的(你写了就直接给你报错),但可以出现在私有部分中。
更多关于CLI语法上的细节请自行搜索查看其它人的文章博客。
④、【添加一个CS项目去调用这个DLL文件】
【其他】
那时我可是被那“CLI 字典 数组 列表”啥的给整恶心了啊,搜需要的数据类型但啥也搜不到(姿势不对?)。然后不知道怎么的我打开了“对象浏览器”于是走进新大陆。(其实CLI的数据类型说白了就是C#的数据类型只是当时蠢没有意识到
不想一个个文件复制黏贴的话可以直接在GitHub里下载项目,传送门:【GitHub/CLI_Demo】
【Record.h】
//【Record.h】
#pragma once
#ifndef RECORD_H
#define RECORD_H
#include<vector>
#include<map>
#include<string>
//C++的原生类,生成库之后该类并不会出现在在C#项目中
class Record {
private:
std::map<char,std::vector<std::string>>mapping;
public:
void AddString(std::string str);//加入字符串,以首字符为索引存进mapping中
std::vector<std::string>GetString(char ch);//根据索引获取字串列表
std::map<char, std::vector<std::string>>GetMapping();//获取mapping
};
#endif // ! RECORD_H
【Record.cpp】
//【Record.cpp】
#include"Record.h"
void Record::AddString(std::string str){
mapping[str