第一种方式:C++导出函数, c#dllimport 的方式
在很多地方都看到过,如[dllimport “user32.dll”]这种代码,调用windows API,就是通过这种方式实现。
例子:新建C++项目,创建动态链接库(DLL),然后添加头文件textdll.h
#pragma once #ifdef A_EXPORTS #define DLL_API __declspec(dllexport) #else #define DLL_API __declspec(dllimport) #endif extern "C" DLL_API void MessageBoxShow(); //通过extern “C” 使MessageBoxShow方法为一个导出方法,外部可见
然后,dllmain.cpp中添加代码:
#include "stdafx.h" #include "textdll.h" BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } #ifdef _MANAGED #pragma managed(push, off) #endif void MessageBoxShow() { MessageBox(NULL, TEXT("Hello World"), TEXT("In a DLL"), MB_OK); } #ifdef _MANAGED #pragma managed(pop) #endif
编译通过后,找到目录下生成的DLL(TESTDLL.dll),拷贝出来,放到C#的debug目录(程序目录)下, 然后新建C#程序:
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; //必须要添加该引用 using System.Text; using System.Threading.Tasks; namespace dlltest { class Program { [DllImport("TESTDLL.dll")] //最关键的,导入该dll public extern static void MessageBoxShow(); static void Main(string[] args) { MessageBoxShow(); } } }
然后运行可以看到结果:成功的调用了C++DLL中的方法。
第二种方式:
通过C++/CLI作为中间层,因为C++/CLI即可调用.NET的类库,又可调用C++原生库,
所以可以通过C# 调用 C++/CLI 再调用 C++ DLL这样的三层调用方式完成。