2012-06-25 105 views
0

我在C#中很新。 我有我自己寫在C++上的dll,我打算在C#應用程序中使用該dll的函數。用C++寫的C#DllImport庫

所以,我做的時候聲明函數在C++項目如下:

public static __declspec(dllexport) int captureCamera(int& captureId); 

然後我試圖導入C#應用這種方法:

[DllImport("MyLib.dll")] 
public static extern int captureCamera(ref int captureId); 

但我有例外:

Unable to find an entry point named 'captureCamera' in DLL 'MyLib.dll'. 

任務是在不指定EntryPoint參數的情況下執行dllimport。任何人都可以幫我嗎?

+0

你應該定義是什麼入口端口在你的C#代碼中。 –

+0

'公共靜態'意味着你的函數在C++類中。 C#只能訪問C函數。此外,語法不正確(應該是'public:static')。所以這顯然不是你真正的功能聲明。 – dialer

+0

從'public static'改爲'public:static' - 沒有任何改變。 –

回答

3

要定義的C++函數沒有外部「C」塊。由於C++允許您重載函數(即使用不同的參數集創建多個captureCamera()函數),因此DLL內的實際函數名稱將會不同。

dumpbin /exports YourDll.dll 

你會得到這樣的事情:?

Dump of file debug\dll1.dll 

File Type: DLL 

    Section contains the following exports for dll1.dll 

    00000000 characteristics 
    4FE8581B time date stamp Mon Jun 25 14:22:51 2012 
     0.00 version 
      1 ordinal base 
      1 number of functions 
      1 number of names 

    ordinal hint RVA  name 

      1 0 00011087 [email protected]@[email protected] = @ILT+130([email protected]@[email protected]) 

    Summary 

     1000 .data 
     1000 .idata 
     2000 .rdata 
     1000 .reloc 
     1000 .rsrc 
     4000 .text 
     10000 .textbss 

captureCamera @@ YAHAAH @ Z可以通過打開Visual Studio命令提示符,將您的二進制文件目錄並運行此檢查是實際編碼您指定的參數的錯位名稱。

正如在其他的答案中提到,簡單的extern「C」添加到你的宣言:

extern "C" __declspec(dllexport) int captureCamera(int& captureId) 
{ 
    ... 
} 

您可以重新檢查,這個名字通過重新運行DUMPBIN是正確的:

Dump of file debug\dll1.dll 

File Type: DLL 

    Section contains the following exports for dll1.dll 

    00000000 characteristics 
    4FE858FC time date stamp Mon Jun 25 14:26:36 2012 
     0.00 version 
      1 ordinal base 
      1 number of functions 
      1 number of names 

    ordinal hint RVA  name 

      1 0 000110B4 captureCamera = @ILT+175(_captureCamera) 

    Summary 

     1000 .data 
     1000 .idata 
     2000 .rdata 
     1000 .reloc 
     1000 .rsrc 
     4000 .text 
     10000 .textbss 
2

你宣佈

extern "C" { 
    __declspec(dllexport) int captureCamera(int& captureId); 
} 

你的C++代碼中 - C#只能訪問C,而不是C++函數。

+0

是的,我在我的C++代碼中有這個聲明。 –

4

public static __declspec(dllexport) int captureCamera(int& captureId);

是那種方法?如果它是功能,則它不能是靜態的,因爲staticdllexport是互斥的。

而且這個名字被破壞了。見http://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B_Name_Mangling。如果你可以得到損壞的名稱,然後提供DllImportEntryPoint=MANGLED_NAME),它應該工作。

可以提供與接頭.def文件,其中包含的導出的函數定義,以及它們的名稱不然後錯位:

Project.def:

EXPORTS 
    captureCamera @1 
+0

任務是在不指定EntryPoint參數的情況下執行dllimport。我剛剛忘記提到這種情況。 –