2011-06-13 103 views
6

我有一個非託管C++ dll,對此我沒有訪問代碼的權限,但擁有所有的方法聲明。使用pinvoke從C#調用非託管C++代碼

讓我們爲了簡單說.H是這樣的:在.cpp文件

#include <iostream> 

#ifndef NUMERIC_LIBRARY 
#define NUMERIC_LIBRARY 

class Numeric 
{ 
    public: 
     Numeric(); 
     int Add(int a, int b); 
     ~Numeric(); 
}; 

#endif 

和方法實現

int Numeric::Add(int a, int b) 
{ 
    return (a + b); 
} 

我只是想打電話從C++的附加功能在我的C#代碼:

namespace UnmanagedTester 
{ 
    class Program 
    { 
     [DllImport(@"C:\CPP and CSharp Project\UnmanagedNumeric\Debug\numeric.dll", EntryPoint = "Add")] 
     public static extern int Add(int a, int b); 


     static void Main(string[] args) 
     { 
      int sum = Add(2, 3); 
      Console.WriteLine(sum); 

     } 
    } 
} 

嘗試執行後我有以下錯誤:

無法在DLL'C:\ CPP和CSharp Project \ UnmanagedNumeric \ Debug \ numeric.dll'中找到名爲'Add'的入口點。

我不能更改C++代碼。不知道發生了什麼問題。 感謝您的幫助。

+1

是不是類的成員方法?不在公共命名空間中? – Tim 2011-06-13 14:57:41

+1

我不是C#中非託管代碼的專家,但我認爲由於Add是Numeric內部的一種方法,因此您很可能需要製作一個Numeric實例並調用該實例上的方法。如果它是靜態的,那麼你的方法可能會奏效。 – 2011-06-13 14:58:15

回答

4

使用PInvoke,你只能調用從Dll導出的全局函數。要使用導出的C++類,您需要編寫C++/CLI包裝器。這是C++/CLI類庫項目,它公開純.NET接口,在內部它鏈接到非託管C++ Dll,從此Dll實例化一個類並調用它的方法。

編輯:你可以從這個開始:http://www.codeproject.com/KB/mcpp/quickcppcli.aspx#A8

+1

謝謝你們的答案,我認爲我可以簡單地使用dllimport從類中調用一個方法,看起來像我錯了。我將介紹一下C++/CLI包裝。亞歷克斯你可以建議任何在線教程這種項目?再次感謝。 – ilyaw77 2011-06-13 15:16:58

2

如果你需要創建一個包裝,看看swig.org。它將爲C#等大多數高級語言生成一個。

我剛剛在幾分鐘前碰到這個程序,同時也在處理與您相同的問題。

2

要使用來自C#的本機C++中的類,您需要在之間使用C++/CLi包裝器,正如前面的答案所述。要真正做到這一點,這不是非常簡單。這裏是我鏈接,告訴你如何在高層次上做到這一點:C++/CLI wrapper for native C++ to use as reference in C#

如果您對此很陌生(像我一樣),您可能會偶然發現1) - 鏈接部分。爲了解決這個問題,你可以看看我是如何在這裏做的(參見我的問題部分):Link error linking from managed to unmanaged C++ despite linking to .lib file with exported symbols