在 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# 中找不到 C++ COM DLL 中的导出函数

C#调用C++导出类的一个实例

在 c# System.AccessViolationException 处导出 c++ 函数和使用函数

从 C# 中的 C++ 代码中获取对象功能

如何导出 C# dll 方法/函数以在 C++ 中使用它 [重复]

c++调用dll导出函数