2013-09-25 114 views
3

我在Win7上用.NET 4.0運行VS2012。 我已經試過如下:從C調用非託管C++#

  • 創建C++ DLL項目
  • 經過\未選中的出口符號框
  • 我確信我的平臺的目標是相同的。在我的情況下,win32
  • 我已經在需要的地方添加了必要的extern「C」和__declspec(dllexport)。
  • 我已經成功編譯了我的DLL,並試圖在C#項目中引用它。

不幸的是,我得到一個錯誤,告訴我它不能被添加,我需要確保它是一個有效的程序集或COM對象。

我已經放棄了試圖讓我的代碼導出,所以我會很滿意只是例子「42」通過!

我試着看它與DUMPBIN,它是正確的出口符號:

1 0 00011023 [email protected]@[email protected] 
2 1 00011127 [email protected]@[email protected]@@Z 
3 2 00011005 [email protected]@@QAEHXZ 
4 3 0001104B [email protected]@YAHXZ 
5 4 00017128 [email protected]@3HA 

我的大腦是新鮮的想法。有人可以請賜我嗎?無論我嘗試什麼,我似乎都會遇到這個錯誤。

+0

很抱歉的格式。以前從未這樣做過。我不知道爲什麼編輯不喜歡我的縮進:( – Joseph

+0

感謝您的編輯,paqogomez! – Joseph

+0

一種常見的方法是有C++/CLI(託管C++)「膠合」項目,可以直接引用C#在這個託管的C++項目中,你可以調用你的本地DLL的函數 – cdoubleplusgood

回答

1

您需要使用DllImportAttribute從.NET代碼中調用駐留在C++ DLL中的函數(使用extern "C"導出)。你不能像.NET程序集一樣引用C++ DLL,也不能使用DLL中的類,只能使用C類函數。從msdn

實施例:

using System; 
using System.Runtime.InteropServices; 

class Example 
{ 
    // Use DllImport to import the Win32 MessageBox function. 
    [DllImport("user32.dll", CharSet = CharSet.Unicode)] 
    public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type); 

    static void Main() 
    { 
     // Call the MessageBox function using platform invoke. 
     MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0); 
    } 
} 
+0

我現在試過這種方法,但它聲稱它找不到入口點我的測試函數,並且我已經驗證了我正在使用dumpbin正確地導出函數,當然,所有東西都是公共的和靜態的,我甚至在build文件夾中放了一個DLL的副本。 – Joseph