将类从C#DLL导入C ++应用程序

时间:2019-05-08 15:42:31

标签: c# c++ dll v8 node-gyp

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

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

这是我的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 Fucker" + 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

1 个答案:

答案 0 :(得分:0)

我通常通过创建静态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文件,并创建以下2个文件:

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();
    }

}

Und项目属性->常规指定静态lib。 在构建设置中,指定x86 / x64 -使用与步骤1中的构建托管库相同的构建类型。

现在,您可以构建dll并将其用于其他不受管理的C ++项目。

对于更高级的内容,例如返回类型和带有参数的方法,您必须在托管/非托管代码之间进行类型编组。在线上有很多资源,其中提供了有关托管/非托管代码之间的类型转换的更多信息。关键字:封送处理