码迷,mamicode.com
首页 > 编程语言 > 详细

记一次C#调用C++踩过的坑

时间:2019-11-09 12:02:30      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:help   int   baidu   代码   tle   需要   目录   工具   string   

一般来说,C#调用C++生产的dll,如下:

C++的项目要设置为"导出dll的项目",而且导出的函数,一般为:

 extern "C" __declspec(dllexport) int Convrnx(int format, rnxopt_t  opt, char *file, char **ofile)

{

  ....

}

弄出一个C++的dll后,放到C#的生成目录下,也就是和.exe放在一起;

而C#,则要:

[DllImport("RtklibHelper.dll", EntryPoint = "Convrnx", CallingConvention = CallingConvention.Cdecl)]
public static extern int Convrnx(int format, rnxopt_t opt, string file, string[] ofile)

{

  ....

}

坑一:C#的类型,怎么和C++的类型对应起来(如例子:string对应*char,string[]对应char**)

解一:有一款神奇的工具,名为:CLRInsideOut,微软的手笔:

技术图片

 

比如说:C++ 中的结构体 rnxopt_t ,其中又嵌套结构体snrmask_t等等,只需要将其用txt自上而下整理好(C++的声明写在前后很讲究),右边直接为C#代码;

 

坑二:在本机C#调用C++一切都正常,放到别的机器就有:找不到指定的模块。 (异常来自 HRESULT:0x8007007E) ,各种搜索尝试都不行(包括尝试安装Vs c++环境)。

程序员的直觉:肯定是C++产出的dll,调用了系统的dll,而别的电脑又不一定有。

思路:找出这个dll,到底调用了什么东西

解二:又是使用微软的工具:

技术图片技术图片

 

 找到了,就是这些dll;

程序员的直觉:这个东西,绝逼是在c:\window下的,搜索一下,发现:WINMM.dll在两个文件夹都有,到底是哪个?

解:只需要到别的电脑搜一下,那个缺少就拷贝那个

全部揪出来:

技术图片

 

 然后放到和exe相同的目录下;(按照C++ dll的习惯,动态库总会在当前目录和系统目录中找,所以没必要一个个放到目标电脑对应的文件夹中)

记一次C#调用C++踩过的坑

标签:help   int   baidu   代码   tle   需要   目录   工具   string   

原文地址:https://www.cnblogs.com/pylblog/p/11824428.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!