您的位置:首页 > 编程语言 > C语言/C++

c#调用c++的dll

2011-12-06 09:50 204 查看

制作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);
}
}
}


源码下载

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: