2012-10-26 237 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#的侧的字符串。