2013-03-14 53 views
1

在C++中轉換C++ DLL時遇到一些問題。只能在C#應用程序中使用C++ DLL中的1/4函數

它正在工作.. DLL中的第一個C++函數只是:int subtractInts(int x, int y)和它的典型身體沒有問題。所有其他功能都很簡單,並經過測試。但是,我一直在遵循一個教程,並做一些時髦的東西來使用C#中的代碼作爲C++ DLL(用於可移植性)。

我的步驟是:

•創建一個C++類,測試並保存它 - 僅使用 'class.cpp' 和 'class.h' 文件 •創建Visual Studio 2010中一個Win32庫項目選擇DLL在啓動時和每個功能我希望暴露給C#..下面的代碼

extern "C" __declspec(dllexport) int addInts(int x, int y) 
extern "C" __declspec(dllexport) int multiplyInts(int x, int y) 
extern "C" __declspec(dllexport) int subtractInts(int x, int y) 
extern "C" __declspec(dllexport) string returnTestString() 

相當關鍵的一點,那就是我externed他們在我的DLL的順序。

然後作爲一個測試,因爲我沒有以前有這個問題..我引用他們以不同的方式在我的C#項目

[DllImport("C:\\cppdll\\test1\\testDLL1_medium.dll", CallingConvention = CallingConvention.Cdecl)] 

    public static extern int subtractInts(int x, int y); 
    public static extern int multiplyints(int x, int y); 
    public static extern int addints(int x, int y); 
    public static extern string returnteststring(); 

這項工作時調用從C#是subtractInts的唯一功能,這顯然是該函數首先被引用。所有其他人在編譯時會導致錯誤(見下文)。

如果我不註釋掉上面的代碼,並從外部引用所有這些函數。我在multipyInts(int x,int y)處得到以下錯誤。

Could not load type 'test1DLL_highest.Form1' from assembly 'test1DLL_highest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' because the method 'multiplyints' has no implementation (no RVA).

我會想象排序,將排序一切。

乾杯。

+0

將它們全部歸屬於DLLI JSJ 2013-03-14 15:49:21

回答

5

您需要添加DllImportAttribute所有四種方法,將刪除路徑,並修復套管:

[DllImport("testDLL1_medium.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern int subtractInts(int x, int y); 
[DllImport("testDLL1_medium.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern int multiplyInts(int x, int y); 
[DllImport("testDLL1_medium.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern int addInts(int x, int y); 
[DllImport("testDLL1_medium.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern string returnTestString(); 

還要確保本地DLL是在相同的位置,你的管理組件(或發現通過正常的DLL發現方法)。

+0

確定已經處理了初始錯誤,但現在當我嘗試調用其中一個函數時'label2.Text = multiplyInts(4,6).ToString();'我得到這個錯誤..'「錯誤名稱'multiplyInts'在當前上下文中不存在\t \\ selafap01 \ homedrives \ mgibson \我的文檔\ visual studio 2010 \ Projects \ test1DLL_highest \ test1DLL_highest \ Form1.cs test1DLL_highest'(它明顯符合它的目錄,但DLL沒有照顧所有這些? – mgibson 2013-03-14 15:58:04

+0

@mgibson您應該確保非託管DLL位於C#項目的可執行文件夾中,並且沒有指定「完整路徑」 – 2013-03-14 16:02:15

+3

還要確保你的外殼與DLL函數名稱相匹配除了'subtractInts'之外,你有它們不同的所有東西 – 2013-03-14 16:05:16

相關問題