2011-01-27 170 views
10

我有一個C# dll。代碼如下:從C++/CLI調用C#dll函數

public class Calculate 
{ 
    public static int GetResult(int arg1, int arg2) 
    { 
     return arg1 + arg2; 
    } 

    public static string GetResult(string arg1, string arg2) 
    { 
     return arg1 + " " + arg2; 
    } 

    public static float GetResult(float arg1, float arg2) 
    { 
     return arg1 + arg2; 
    } 

    public Calculate() 
    { 
    } 
} 

現在,我計劃在這條路上從C++調用此DLL。

[DllImport("CalculationC.dll",EntryPoint="Calculate", CallingConvention=CallingConvention::ThisCall)] 
extern void Calculate(); 

[DllImport("CalculationC.dll",EntryPoint="GetResult", CallingConvention=CallingConvention::ThisCall)] 
extern int GetResult(int arg1, int arg2); 

這裏是函數,其中被稱爲調用getResult

private: System::Void CalculateResult(int arg1, int arg2) 
{ 
    int rez=0; 

    //Call C++ function from dll 
    Calculate calculate=new Calculate(); 
    rez=GetResult(arg1,arg2); 
} 

我得到了錯誤: 「語法錯誤:標識符 '計算'」。 有人可以幫助我解決這個可怕的錯誤嗎?

+4

如果你使用的是C++ CLI,爲什麼不直接引用c#程序集呢? DllImport是爲了讓你可以從託管代碼中調用非託管dll, – santiagoIT 2011-01-27 15:18:49

+0

我有點困惑於Visual Studio C++。我的DLL正確地在VS2010 C++項目中,我用Assembly.LoadFile嘗試了沒有任何成功。 – 2011-01-27 15:24:51

回答

20

您必須使用C++ CLI,否則您無法調用DllImport。 如果是這種情況,你可以參考c#dll。

在C++ CLI中,您可以做如下:

using namespace Your::Namespace::Here; 

#using <YourDll.dll> 

YourManagedClass^ pInstance = gcnew YourManagedClass(); 

其中 'YourManagedClass' 與輸出組件的C#項目定義 'YourDll.dll'。編輯** 添加您的示例。

這就是你們的榜樣需要怎麼看起來像在CLI(爲清楚起見,我假定使得G etResult不是一個靜態的功能,否則你只需調用計算::調用getResult(...)

private: System::Void CalculateResult(int arg1, int arg2) 
{ 
    int rez=0; 
    //Call C++ function from dll 
    Calculate^ calculate= gcnew Calculate(); 
    rez=calculate->GetResult(arg1,arg2); 
}