通常來講,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的習慣,動態庫總會在當前目錄和系統目錄中找,因此不必一個個放到目標電腦對應的文件夾中)