用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++中变量的转换需要及其注意,其中对于字符串作为输入和输出参数的情况需尤其注意。

posted @ 2019-04-01 14:50  Brisk  阅读(1311)  评论(0编辑  收藏  举报