通常来讲,C#调用C++生产的dll,以下:c++
C++的项目要设置为"导出dll的项目",并且导出的函数,通常为:程序员
extern "C" __declspec(dllexport) int Convrnx(int format, rnxopt_t opt, char *file, char **ofile)ide
{函数
....工具
}orm
弄出一个C++的dll后,放到C#的生成目录下,也就是和.exe放在一块儿;blog
而C#,则要:get
[DllImport("RtklibHelper.dll", EntryPoint = "Convrnx", CallingConvention = CallingConvention.Cdecl)]
public static extern int Convrnx(int format, rnxopt_t opt, string file, string[] ofile)string
{it
....
}
坑一: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的习惯,动态库总会在当前目录和系统目录中找,因此不必一个个放到目标电脑对应的文件夹中)