在C#中调用C ++导出的函数

时间:2012-03-17 07:26:04

标签: c# c++ dll clr extern

我有以下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 = "_GetVale@4")]
    internal static extern string Getvalue();

我这样做只是为了学习和理解。当我调用它时,我得到一个PInvoke异常,说我的CallingConvention不正确。我确信我的文件中的错误很小。我知道入口点是“_GetVale @ 4”,因为我使用程序来查找它。如果我不能将其改为其他任何东西,它会抛出一个未找到的入口点,所以我的问题就是其他地方。

我究竟做错了什么?谢谢!

1 个答案:

答案 0 :(得分:3)

对于使用C ++类型的函数,不能使用简单的p调用。你应该把自己限制在纯粹的c。


返回char*很少是正确的解决方案。你会遇到终生问题:目前还不清楚何时以及如何释放返回值。

一个标准模式是调用者传入char*length,并且被调用者填充此缓冲区。

C

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. 创建SWIG包装器
  2. 使用CXXI
  3. 我不太喜欢SWIG。使用它有点烦人,它需要一个C ++双面包装器。 CXXI听起来很有趣,但我自己并没有使用它。