c#调用c++的dll
制作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);
}
}
}
源码下载
勉強心を持てば、生活は虚しくない!
浙公网安备 33010602011771号