我有以下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”,因为我使用程序来查找它。如果我不能将其改为其他任何东西,它会抛出一个未找到的入口点,所以我的问题就是其他地方。
我究竟做错了什么?谢谢!
答案 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 ++:
我不太喜欢SWIG。使用它有点烦人,它需要一个C ++双面包装器。 CXXI听起来很有趣,但我自己并没有使用它。