制作c++的dll
// MyCppDll.cpp : 定义 DLL 应用程序的导出函数。 // 这一句必须 #include "stdafx.h" // 导入自己想要的头文件 #include <windows.h> // 为函数加入以下声明即可导出:extern "C" extern __declspec(dllexport) // 另外,加入以上声明后函數調用約定默认为“Cdecl”,若要强制指定为,请在函数的返回类型之后加入“__stdcall”关键字 extern "C" extern __declspec(dllexport) LPCWSTR __stdcall Hello(LPCWSTR lpTitle,LPCWSTR lpContent) { MessageBox(NULL,lpContent,lpTitle,0); return lpContent; } // 定义 DLL 应用程序的入口点。 // 比如当dll刚被载入至内存或卸载时可以做一些事 BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: Hello(L"",L"DLL_PROCESS_ATTACH"); break; case DLL_THREAD_ATTACH: Hello(L"",L"DLL_THREAD_ATTACH"); break; case DLL_THREAD_DETACH: Hello(L"",L"DLL_THREAD_DETACH"); break; case DLL_PROCESS_DETACH: Hello(L"",L"DLL_PROCESS_DETACH"); break; } return TRUE; }
写c#
using System; using System.Runtime.InteropServices; namespace MyCsharpConsoleApplication { class Program { [DllImport("MyCppDll", CallingConvention = CallingConvention.StdCall)] extern static string Hello(string title, string content); static void Main() { var ret = Hello(@"hello你好".ToAnsi(), @"theraphy大叮当".ToAnsi()); Console.WriteLine(ret); } } static class Helper { /// <summary> /// 将Unicode字符串转换成多字节字符串 /// </summary> /// <param name="content"></param> /// <returns></returns> public static string ToAnsi(this string content) { return System.Text.Encoding.Default.GetString(System.Text.Encoding.Unicode.GetBytes(content)); } } }
也可以直接声明Unicode编码传递
using System; using System.Runtime.InteropServices; namespace MyCsharpConsoleApplication { class Program { [DllImport("MyCppDll", CallingConvention = CallingConvention.StdCall,CharSet = CharSet.Unicode)] extern static string Hello(string title, string content); static void Main() { var ret = Hello(@"hello你好", @"theraphy大叮当"); Console.WriteLine(ret); } } }