2012-03-17 75 views
0

我有下面的C++代碼:調用C++導出的函數在C#

#pragma once 
#include "StdAfx.h" 
#include <string> 
using namespace std; 
using namespace System; 


extern "C" __declspec(dllexport) string __stdcall GetVale() 
{ 
    return "test"; 
} 

我想通過這樣來調用C#這樣的功能:

[DllImport("Security.dll", CallingConvention = CallingConvention.StdCall, ExactSpelling = true, EntryPoint = "[email protected]")] 
    internal static extern string Getvalue(); 

我這樣做只是爲了學習並真正理解。當我打電話給我時,我收到一個PInvoke異常,說我的CallingConvention不正確。我相信我的文件中的錯誤非常小。我知道入口點是「_GetVale @ 4」,因爲我使用了一個程序來查找它。如果我不能把它改成其他任何東西,它會拋出一個找不到的入口點,所以我的問題是其他地方的問題。

我究竟做錯了什麼?謝謝!

+1

您不能調用返回C++對象(如std :: string)的C++函數。 C++/CLI包裝器是必需的。 – 2012-03-17 07:44:39

回答

3

對於使用C++類型的函數,不能使用簡單的p-invoke。你應該限制自己純c。


返回char*很少是正確的解決方案。你會遇到一生的問題:目前還不清楚何時以及如何釋放回報價值。

一個標準模式是呼叫者在char*length中傳遞,並且調用者填充此緩衝區。

Ç

extern "C" __declspec(dllexport) void __stdcall GetValue(char* buf, in length) 

C#

[DllImport("Security.dll", CallingConvention = CallingConvention.StdCall, Charset = CharSet.Ansi] 
internal static extern void GetValue(StringBuilder buf, int length); 

有幾種方式使用C直接++的工作:

  1. 創建了一大口包裝
  2. 使用CXXI

我不太喜歡SWIG。使用它有點煩人,它需要一個C++封裝。 CXXI聽起來很有趣,但我自己並沒有使用它。

+1

+1,因爲CXXI可以成爲C++/C#interop的更光明的未來。 – 2012-03-17 09:44:00