用C++编写C#可调用的DLL
最近项目需要,要将一些关键算法放入DLL中。考虑到希望用VMProtect将代码保护起来,于是使用C++编写该DLL。
-- By Brisk Yu
但是因为这个DLL最终是需要被C#调用的,因此在此记录一下步骤。
1 创建工程
打开VS2017,新建项目,如图所示勾选:
生成成功后,修改项目属性:
2 用C++编写DLL
编写相关的算法后,编写一个包含入口点的CPP供C#程序调用:
extern "C" _declspec(dllexport) char* Func(char* str) { //TODO }
之后编译。注意似乎X64不能正常工作,需编译X86版本。此外,如果release版本无法使用,尝试使用debug版本。Release版本做过优化后,对于某些不健壮的C++语句可能会出现异常(如未初始化就引用之类的问题)。
3 C#调用C++编写的DLL
将1中编译好的DLL放入工程的bin文件夹下。在程序中通过DLLImport引用。注意对于引用C++的DLL,需要添加特性CallingConvention = CallingConvention.Cdecl。
[DllImport("Prometheus.dll", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr Func(byte[] str);
调用时注意C#中的变量和C++中的变量不一样,需要增加转换后才可使用:
string retlust = Marshal.PtrToStringAnsi(Func(Encoding.ASCII.GetBytes("admin")));
对于C#和C++中变量的转换需要及其注意,其中对于字符串作为输入和输出参数的情况需尤其注意。