如何在 C# 和 C++ 之间进行互操作

Posted

技术标签:

【中文标题】如何在 C# 和 C++ 之间进行互操作【英文标题】:How to Interop between C# and C++ 【发布时间】:2016-11-09 09:49:05 【问题描述】:

我正在尝试在两种语言之间进行非常基本的互操作。我基本上有一些我想在 C++ 中处理的性能密集型代码,然后将结果返回给我的应用程序。

所有内容都将在 Visual Studio 中编译。

我选择 int 作为输入和输出类型,因为编组可能有点不稳定,并不是我真正要处理的。

我有 C++:

#include "stdafx.h" // default from vs2013, no idea what it is

_declspec(dllexport) int Diu(int p) 
    return p * 2;

我有 C#:

using System;

namespace Interop 
    public class Program
        [System.Runtime.InteropServices.DllImport("Hardworker.dll")]
        public static extern int Diu(int p);

        private static void Main(string[] args) 
            Console.WriteLine(Diu(2));
        
    

所以这是一个非常基本的例子。但我得到了例外:

“System.BadImageFormatException”类型的未处理异常 发生在 Interop.exe 中

附加信息:尝试加载具有 格式不正确。 (HRESULT 异常:0x8007000B)

C++ 项目在创建对话框中创建为控制台应用程序 > Dll。 我在反汇编程序中检查了 C++ dll,我可以看到一个 Diu 作为导出符号。

呃。设置互操作时我错过了什么?

【问题讨论】:

(或未来的读者)除了注意匹配平台(x86 与 x64,原生 C++ 不支持 AnyCPU)和名称修改之外,还要注意匹配 C++ 之间的调用约定代码和 p/invoke 声明。 【参考方案1】:

当您收到此错误时:HRESULT: 0x8007000B 是由平台不兼容引起的。 检查您的编译器配置文件是否设置为相同的平台(x86x64AnyCPU)。

【讨论】:

不错。我的电脑是x64的。我将编译设置为 x86。并且错误更改为 EntryPointNotFoundException: Unable to find an entry point named 'Diu' in DLL 'Hardwork.dll'。 @Cyber​​Fox C++ 根据参数类型和函数的其他限定符修改函数名称。您需要声明函数extern "C",以便使用名称导出而不会损坏。 @YngveHammesrland 确实有效。 1 中有 2 个答案。

以上是关于如何在 C# 和 C++ 之间进行互操作的主要内容,如果未能解决你的问题,请参考以下文章

使用 COM 互操作从非托管 C++ 访问 c# 属性

C# 和 C++ 互操作

在没有 Java EE 应用服务器的情况下使用 Web 服务在 C# 和 Java 之间进行互操作?

COM如何实现语言互操作?

通过互操作将字符串数组从 C# 传递到 C++

如何读取 C++ SAFEARRAY**,它是 C# 返回值为 byte[] 的 COM 互操作的结果?