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

5

我正在尝试在这两种语言之间进行非常基本的互操作。我有一些性能密集型代码,我想在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 vs x64,本机C++不支持AnyCPU)和名称修饰外,还要注意在C++代码和p/invoke声明之间匹配调用约定。 - Ben Voigt
1个回答

4
当你遇到这个错误:HRESULT: 0x8007000B时,它是由于平台不兼容引起的。
请检查编译器配置文件是否设置为相同的平台(x86x64AnyCPU)。

不错。我的电脑是x64。我将编译设置为x86。然后错误变成了EntryPointNotFoundException:在DLL“Hardwork.dll”中找不到名为“Diu”的入口点。 - CyberFox
2
@CyberFox C++ 根据函数的参数类型和其他限定符来混淆函数名。您需要声明函数为 extern "C",以便导出函数名称不带混淆。 - Yngve Hammersland
@YngveHammesrland,这真的起作用了。一次得到两个答案。 - CyberFox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接