使用C++调用C#生成的dll相关笔记

6 篇文章 0 订阅

    因为工作需要,近期一直在学习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放到当前目录,二者缺一不可,这让我很困惑,如果有人有遇到过类似的情况,希望可以联系我给个解释,此处留下标记。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值