如何在Visual Studio 2008中创建.dll以在C#应用程序中使用?

时间:2009-05-18 14:01:19

标签: c# c++ visual-studio-2008 dll

我有一个C ++类,我想从C#应用程序访问。我需要访问构造函数和单个成员函数。目前该应用程序接受stl::vector s形式的数据,但如果不太可行,我可以进行一些转换吗?

我在网上发现了一些文章,描述了如何调用C ++ DLL以及其他描述如何为其他目的制作.dll项目的文章。我很难找到在Visual Studio 2008中创建它们以供在C#应用程序中使用的指南(VS 6.0似乎有一些,但它们指定的大多数选项似乎没有出现在2008版本中)。

如果有人有分步指南或相当基本的例子,我会非常感激。

5 个答案:

答案 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包装器中。