将 class 从 c# dll 导入到 c++ 应用程序

Importing a class from a c# dll into a c++ app

我需要从 c++ 导入一个用 c# 制作的 dll 我发现的所有示例都从 dll 导入单个函数,但据我所知,如果不导出整个函数,就无法从 c# 导出单个函数 class(虽然我是一个 c# 新手)

我正在使用 node gyp 对其进行编译(我正在使用 v8 为我的网络应用程序构建一个节点模块)

这是我的 C# 代码:

using System;
using System.IO;
using System.Runtime.InteropServices;

[ComVisible(true)]
public class Hello 
{
    public static void Main() 
    {
        Console.WriteLine("Hello World!");
        string createText = "Hello World" + Environment.NewLine;
        File.WriteAllText(".\asd.txt", createText);
    }
}

这是我的 C++ 头文件:

#ifndef ASDLIB_H
#define ASDLIB_H
#define ASD_IMPORT __declspec(dllimport)
#define STDCALL __stdcall

class ASD_IMPORT Hello{
    public:
         STDCALL static void ASD_IMPORT Main();
};

#endif // ASDLIB_H

我通常通过创建静态 C++ CLR 包装器库来完成此类工作。

这些是我通常使用的步骤(虽然我不经常使用):

这里是使用 Visual Studio 的最小示例:

1.创建托管 C# .NET 库项目

给它起个名字HelloLibManaged 包含一个文件 Hello.cs 和以下内容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloLibManaged
{
    public class Hello
    {
        public void Print()
        {
            System.Console.WriteLine("Hello from Managed Lib");
        }
    }
}

使用 x86 或 x64 构建此库,只是不要任何 CPU

2。在同一个解决方案中创建一个新的 C++ CLR 静态库项目。 我们将其命名为 HelloLibCpp

  • 通过 Project->Add Reference

  • 添加对 HelloLibManaged 项目的引用
  • 从 Project 中删除自动创建的现有 .h/.cpp 文件,并创建这两个文件:

HelloUnmanaged.h

#pragma once

namespace hello_managed {

    class Hello
    {
    public:
        void Print();
    };
}

HelloUnmanaged.cpp:

#include "HelloUnmanaged.h"

namespace hello_managed
{

    void Hello::Print()
    {
        HelloLibManaged::Hello^ hello = gcnew HelloLibManaged::Hello();
        hello->Print();
    }

}

Under Project Properties -> General 指定静态库。 在 构建设置中指定 x86 / x64 - 使用 与步骤 1 中构建托管库相同的构建类型。

现在您可以构建 dll 并将其用于其他非托管 C++ 项目。

对于更高级的东西,例如 return 类型和带有参数的方法,您必须在 managed/unmanaged 代码之间执行 Type-Marshalling。网上有很多资源,其中包含有关 Type-Conversion 之间 managed/unmanaged 代码的更多信息。关键字:编组.