2012-03-17 72 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