在 C# 中调用 C++ 导出函数 [关闭]
Posted
技术标签:
【中文标题】在 C# 中调用 C++ 导出函数 [关闭]【英文标题】:Call C++ Exported Function in C# [closed] 【发布时间】:2012-03-17 07:26:04 【问题描述】:我有以下 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”,因为我使用了一个程序来找到它。如果我不能将其更改为其他任何内容,则会引发找不到入口点,所以我的问题出在其他地方。
我到底做错了什么?谢谢!
【问题讨论】:
您不能 pinvoke 返回 C++ 对象(如 std::string)的 C++ 函数。需要 C++/CLI 包装器。 【参考方案1】:您不能对使用 C++ 类型的函数使用简单的 p-invoke。你应该把自己限制在纯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 包装器
使用 CXXI
我不太喜欢 SWIG。使用起来有点烦人,而且它需要一个 C++ 面的包装器。 CXXI听起来很有趣,但我自己没用过。
【讨论】:
+1,因为 CXXI 可以成为 C++/C# 互操作的光明未来。以上是关于在 C# 中调用 C++ 导出函数 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
在 c# System.AccessViolationException 处导出 c++ 函数和使用函数