📜  从 C 或 C++ 调用 .NET 程序集 - C# (1)

📅  最后修改于: 2023-12-03 15:06:30.414000             🧑  作者: Mango

从 C 或 C++ 调用 .NET 程序集 - C#

简介

在开发过程中,有时需要将 C 或 C++ 程序调用 .NET 程序集,这时候可以使用 C# 编写的封装类,将 .NET 程序集暴露给 C 或 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# 封装类

编译 C# 封装类,生成 DLL 文件。请确保编译后的 DLL 文件名和路径与注解中的文件名和路径相同。

第三步:在 C 或 C++ 文件中声明 C# 封装类方法

在 C 或 C++ 文件中,使用 extern 关键字声明 C# 封装类的 .NET 方法。

示例代码:

extern "C" _declspec(dllimport) void __stdcall MyFunction();

该示例代码中,使用了 extern "C" 关键字指定使用 C 调用约定,_declspec(dllimport) 指定需要从 DLL 文件中导入该函数。

第四步:调用 C# 封装类方法

在 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++ 程序中指定的文件名和路径一致。