2012-10-26 129 views
0

我需要從c#調用一個C++回調函數,該函數返回一個字符串。當我嘗試使用下面的代碼時,應用程序崩潰很嚴重(有消息說它可能是由於堆損壞)。從C++調用的C++函數指針返回字符串#

這裏的C++代碼:

static String^ CppFunctionThatReturnsString() 
{ 
    return gcnew String("From C++"); 
} 

void main() 
{ 
    CSharp::CSharpFunction(IntPtr(CppFunctionThatReturnsString)); 
} 

而這裏的C#代碼:

public class CSharp 
{ 
    private delegate string CppFuncDelegate(); 

    public static void CSharpFunction(IntPtr cppFunc) 
    { 
     var func = (CppFuncDelegate)Marshal.GetDelegateForFunctionPointer(cppFunc, typeof(CppFuncDelegate)); 
     func(); // Crash 
    } 
} 

我必須做一些與字符串編組魔法返回之前?

回答

1

爲什麼你首先使用函數指針呢?就在委託的實例傳遞給C#代碼:

C++:

static String^ CppFunctionThatReturnsString() 
{ 
    return gcnew String("From C++"); 
} 

void main() 
{ 
    CSharp::CSharpFunction(new CSharp::CppFuncDelegate(CppFuncThatReturnsString)); 
} 

C#:

public class CSharp 
{ 
    private delegate string CppFuncDelegate(); 

    public static void CSharpFunction(CppFuncDelegate d) 
    { 
     d(); 
    } 
} 

我想你可能需要把CppFuncThatReturnsString一類中。

+0

@TorbjörnKalin請勿在代碼中進行此類更改。 更好地指出他們回答的人 –

+0

顯然,這是做到這一點的方法......而且,這樣,我不必擔心被破壞的返回char *(如果它在堆棧中)。謝謝! –

+0

@編碼Mash爲什麼不呢?我的編輯不會改變答案的正確性。我會說這就像修改拼寫錯誤/拼寫錯誤。 –

0

我在this ten year old page找到了答案。

C++:

static const char* __stdcall CppFunctionThatReturnsString() 
{ 
    return "From C++"; 
} 

void main() 
{ 
    CSharp::CSharpFunction(IntPtr(CppFunctionThatReturnsString)); 
} 

C#:

public class CSharp 
{ 
    private delegate IntPtr CppFuncDelegate(); 

    public static void CSharpFunction(IntPtr cppFunc) 
    { 
     var func = (CppFuncDelegate)Marshal.GetDelegateForFunctionPointer(cppFunc, typeof(CppFuncDelegate)); 
     Marshal.PtrToStringAnsi(func()); 
    } 
} 

即,把它作爲一個IntPtr並將其編組到C#的側的字符串。