如何在 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
是由平台不兼容引起的。
检查您的编译器配置文件是否设置为相同的平台(x86
、x64
或 AnyCPU
)。
【讨论】:
不错。我的电脑是x64的。我将编译设置为 x86。并且错误更改为 EntryPointNotFoundException: Unable to find an entry point named 'Diu' in DLL 'Hardwork.dll'。 @CyberFox C++ 根据参数类型和函数的其他限定符修改函数名称。您需要声明函数extern "C"
,以便使用名称导出而不会损坏。
@YngveHammesrland 确实有效。 1 中有 2 个答案。以上是关于如何在 C# 和 C++ 之间进行互操作的主要内容,如果未能解决你的问题,请参考以下文章