将 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 代码的更多信息。关键字:编组.
我需要从 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 代码的更多信息。关键字:编组.