我有一个C ++类,我想从C#应用程序访问。我需要访问构造函数和单个成员函数。目前该应用程序接受stl::vector
s形式的数据,但如果不太可行,我可以进行一些转换吗?
我在网上发现了一些文章,描述了如何调用C ++ DLL以及其他描述如何为其他目的制作.dll项目的文章。我很难找到在Visual Studio 2008中创建它们以供在C#应用程序中使用的指南(VS 6.0似乎有一些,但它们指定的大多数选项似乎没有出现在2008版本中)。
如果有人有分步指南或相当基本的例子,我会非常感激。
答案 0 :(得分:3)
如果此类DLL不受管理。你将不得不使用P / invoke。 p / invoke函数定义如下所示:
[DllImport("Library_Name.dll", EntryPoint = "function")]
public static extern void function();
另一方面,如果是托管(C ++ / CLI)DLL(或程序集)。您可以通过在.NET项目中添加对它的引用来访问它。
修改强> 我想我根本没回答你的问题。但是要创建要从.NET访问的托管C ++ DLL,请创建一个新项目并选择: Visual C ++ / CLR /类库。然后,只需将其输出DLL添加到C#项目中。
那就是这样做的。 :)
答案 1 :(得分:3)
在C ++和C#之间进行互操作的最简单方法是使用托管C ++或C ++ / CLI。在VisualStudio中,创建一个“CLR类库”类型的新C ++项目。您希望C#可以使用的部分有一些新的语法,但您可以像往常一样使用常规C ++。
在这个例子中,我使用std::vector<int>
只是为了表明你可以使用标准类型 - 但是,在实际的应用程序中,我更愿意尽可能使用.NET类型(在这种情况下是System::Collections::Generic::List<int>
)。
#pragma unmanaged
#include <vector>
#pragma managed
public ref class CppClass
{
public:
CppClass() : vectorOfInts_(new std::vector<int>)
{}
// This is a finalizer, run when GC collects the managed object
!CppClass()
{ delete vectorOfInts_; }
void Add(int n)
{ vectorOfInts_->push_back(n); }
private:
std::vector<int>* vectorOfInts_;
};
编辑:更改了类以按指针而非按值保存向量。
答案 2 :(得分:1)
你有一个你想重新构建为dll的现有C ++ exe吗?或者你是否拥有C ++类? 如果您拥有的只是C ++类,那么您可能会考虑构建一个.Net dll。虽然你无法将stl类型从C#传递给C ++,但我很确定你可以传递托管的.Net类型 如果必须在类中使用stl类型,则可以转换C ++类或调用应用程序中的数据。
答案 3 :(得分:0)
我发现a tutorial有效。但请注意,您必须小心将.dll复制到与可执行文件相同的目录中。我试图告诉可执行文件DLL在哪里但最终放弃了,我搞砸了。
答案 4 :(得分:-1)
在C#中使用非托管C ++ Dll可能非常繁琐。
“更简单”的路径是将其放在COM包装器中。