2009-05-18 80 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的位置,但最終放棄了。

相關問題