我需要从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
答案 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
从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 ++项目。
对于更高级的内容,例如返回类型和带有参数的方法,您必须在托管/非托管代码之间进行类型编组。在线上有很多资源,其中提供了有关托管/非托管代码之间的类型转换的更多信息。关键字:封送处理。