因为工作需要,近期一直在学习C#相关的知识,今天早上想到自己工作还要使用C++,那么自己在同时使用这两种语言的时候,如果想复用自己的c#实现的函数或代码应该怎么办?
说干就干,首先我使用VS2017创建了一个C#项目,
实现了一个很简单的代码,然后生成dll。
然后我又创建了一个c++的控制台应用,
查询了网上的案例,配置了项目属性里的对应属性,因为是跨语言,所以必须把公共语言运行时支持勾选上。
然后是配置头文件引入,在这里需要使用#using +"filePath"的方式将自己的c#dll引入,然后using自己之前定义的的命名空间
#include "pch.h"
#include <iostream>
#using "C:\Users\wangqx\source\repos\ClassLibrary1\ClassLibrary1\bin\Debug\ClassLibrary1.dll"
using namespace ClassLibrary1;
再来就是上代码了
int main()
{
int n;
Class1 ^c = gcnew Class1();//托管类型的内存由gcnew分配,使用垃圾回收进行分配,指针定义前缀用“^”而不是“*”
c->Sex = "nigzz";
//std::cout << c->Sex;这里使用cout不能正确的将成员打印出来,暂时还不清楚为什么,如果有了解的麻烦在评论里略作讲解,不胜感激
printf("%s\n", c->Sex);
std::cin >> n;
return 0;
}
点击运行,出错了,错误如下
在网上一通搜,搜了一个解决方案,如下:
1、将dll工程的输出类型和应用程序的输出类型保持一致,
2、确保自己的dll引入到了应用程序的工程项目里。
经检查,左边是c#写的dll工程,右边是c++的应用和程序,两个并不冲突,方案一,凉凉,问题在哪呢。
查验了一边自己的外部依赖项,自己的dll已经在列表里了,方案二,黄~~
无奈,咨询自己的技术导师,导师根据我提供的资料思考了一会,也有点懵逼,最后专门跑到我的工位前(我和自己的技术导师坐的比较远),看了一遍我的项目的实际文件目录,一拍脑门,让我将之前生成的dll文件直接copy到应用程序的工程里,然后测试,成功了。
综上,有了一些感悟,于是我便去了msdn搜索微软VS的#using Directive (C++/CLI),有这样一段描述:
The compiler will search for references along the following path: //编译器的调用路径选择
-
A path specified in the #using statement. //搜索using指定的目录
-
The current directory. //搜索当前目录
-
The .NET Framework system directory. //.NET Framework系统目录
-
Directories added with the /AI compiler option. //编译器选项添加了using目录的
-
Directories on LIBPATH environment variable. //LIBPATH环境变量的目录
-
换言之,理论上讲,并不需要我将我自己实现的DLL放到当前目录下,编译器会根据我给的路径去查找,但现在的情况是,即使我将自己的dll放到了当前目录下,我仍旧需要使用using引入。另一方面,即使我使用using引用了我的dll,我仍旧需要将自己的dll放到当前目录,二者缺一不可,这让我很困惑,如果有人有遇到过类似的情况,希望可以联系我给个解释,此处留下标记。