📅  最后修改于: 2023-12-03 15:06:30.414000             🧑  作者: Mango
在开发过程中,有时需要将 C 或 C++ 程序调用 .NET 程序集,这时候可以使用 C# 编写的封装类,将 .NET 程序集暴露给 C 或 C++ 程序调用。
在 Visual Studio 中创建一个 C# Class Library 项目,编写一个类,暴露需要被 C 或 C++ 程序调用的方法。
示例代码:
using System.Runtime.InteropServices;
namespace MyLibrary
{
public class MyClass
{
// 使用 DllImport 注解,指定 DllImport 格式
[DllImport("MyDll.dll", EntryPoint = "MyFunction")]
public static extern void MyFunction();
}
}
该示例代码中,使用了 DllImport
注解来指定 C 或 C++ 程序将会调用的函数名和 DLL 文件名。
编译 C# 封装类,生成 DLL 文件。请确保编译后的 DLL 文件名和路径与注解中的文件名和路径相同。
在 C 或 C++ 文件中,使用 extern
关键字声明 C# 封装类的 .NET 方法。
示例代码:
extern "C" _declspec(dllimport) void __stdcall MyFunction();
该示例代码中,使用了 extern "C"
关键字指定使用 C 调用约定,_declspec(dllimport)
指定需要从 DLL 文件中导入该函数。
在 C 或 C++ 文件中,通过实例化 C# 封装类对象,并调用其方法。
示例代码:
#include <Windows.h>
int main()
{
HMODULE library = LoadLibrary(L"MyLibrary.dll");
if (library == NULL)
{
// DLL 文件无法加载,打印错误信息
DWORD error = GetLastError();
return error;
}
typedef void (__stdcall *MyFunctionPrototype)();
MyFunctionPrototype MyFunction = (MyFunctionPrototype)GetProcAddress(library, "MyFunction");
if (MyFunction == NULL)
{
// 导入函数失败,打印错误信息
DWORD error = GetLastError();
return error;
}
// 调用 C# 封装类方法
MyFunction();
// 卸载 DLL 文件
FreeLibrary(library);
return 0;
}
该示例代码中,首先加载 DLL 文件,获取函数指针,然后调用 C# 封装类方法。
通过使用 C# 封装类,可以将 .NET 程序集暴露给 C 或 C++ 程序调用。需要注意的是,需要确保 C# 封装类编译后生成的 DLL 文件名和路径与 C 或 C++ 程序中指定的文件名和路径一致。