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

标签 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”,因为我用程序找到了它。如果我无法将其更改为其他任何内容,它会抛出一个未找到的入口点,所以我的问题出在其他地方。

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

最佳答案

您不能对使用 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

我不太喜欢 SWIG。使用起来有点烦人,而且它需要 C++ 支持的包装器。 CXXI 听起来很有趣,但我自己没用过。

关于c# - 在 C# 中调用 C++ 导出的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9748156/

相关文章:

c# - 如何以编程方式限制对 Web 服务的访问?

c# - 是否有机会用 TPL 替换 while 循环?

c# - 仅显示index.cshtml中的x个项目

c++ - Dll 正在加载,但加载库给出了错误代码 5,GetProcAddress 也生成了相同的错误代码 5

c++ - 使用 C++ 注入(inject) ASM/OPcode

c++ - VS2010 : Add company name,等到一个DLL

使用 Async CTP 并引发 InvalidOperationException "Task_Start_NullAction"的 C# 代码

c++ - 移位可移植性

c++ - ldd 显示重复的共享库

c++ - ABC 中的多态静态常量成员变量?