2009-05-18 83 views
3

我有一个C++类,我想从C#应用程序访问。我需要访问构造函数和一个成员函数。目前该应用程序以stl::vector的形式接受数据,但如果这不可行,我可以进行一些转换?如何在Visual Studio 2008中创建一个用于C#应用程序的.dll?

我发现了一些在线文章,介绍了如何调用C++ DLL和其他描述如何为其他目的制作.dll项目的其他文章。我很努力地在Visual Studio 2008中找到一个在C#应用程序中使用它们的指南(虽然似乎有一些适用于VS 6.0,但他们指定的大多数选项似乎并未出现在2008版本中)。

如果有人有一个分步指导或一个相当基本的例子,我会很感激。

回答

2

在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_; 
}; 

编辑:改变了类通过指针,而不是由值来保存矢量。

+0

+1>不错的例子和我可以工作的东西来转换我已经结束 - 优秀的东西! – 2009-05-18 15:18:22

1

你有一个现有的C++ EXE,你想重新建立一个DLL?还是你有C++类?
如果您拥有的只是C++类,那么您可能会考虑构建.Net dll。虽然您无法将C#中的stl类型传递给C++,但我确信您可以传递托管的.Net类型。
如果您必须在类中使用stl类型,则可以在C++类或调用应用程序中转换数据。

+0

我有一个.exe,但它只是一个测试用具。这是我想要访问的课程。我无法避免在内部使用stl类型,但正如你所建议的那样,我总是可以从一个数组或任何C#传入的内容进行转换。任何想法你需要在VS中选择什么选项? – 2009-05-18 14:45:39

-1

使用非托管C++ Dll在C#中非常繁琐。

“更简单”的路线是将其放置在COM包装中。

+0

你有没有任何路线的例子来支持你所说的?正如我在问题中所说的那样,我希望有一个简单的例子... – 2009-05-18 14:46:39

3

如果这样的DLL是不受管理的。你将不得不使用P/invoke。的p /调用函数定义如下:

[DllImport("Library_Name.dll", EntryPoint = "function")] 
public static extern void function(); 

如果,在另一方面,是一个托管(C++/CLI)DLL(或组件)。您可以通过在.NET项目中添加对其的引用来访问它。

编辑: 我想我没有回答你的问题。但是要创建一个托管的C++ DLL以便从.NET访问,请创建一个新项目并选择: Visual C++/CLR/Class Library。然后,只需将其输出DLL添加到C#项目中即可。

这样做。 :)

0

我发现a tutorial哪些工作。尽管如此,您必须小心将.dll复制到与可执行文件相同的目录中。我搞砸了,试图告诉可执行文件DLL的位置,但最终放弃了。

相关问题