如何使用 Interop 将地图从 C++ 导出到 C#?

问题描述 投票:0回答:1

嗨,我在 C++ 中有这样的代码

extern "C" __declspec(dllexport) bool CallCustomObjectGetPropertyValue(AcDbObject* obj, long objId, std::map<std::string, std::vector<std::string>>& mapToFill) {
    CustomObject* custom = dynamic_cast<CustomObject*>(obj);
    if (!custom) {
        acutPrintf(_T("\nERROR: custom object is nullptr"));
        return false;
    }
    std::map<std::string, std::vector<std::string>> EmptyMapToFill = {};
    mapToFill = EmptyMapToFill;

我尝试将空地图分配给mapToFill,但出现错误“读取访问冲突。 _Head 是 0x400。”。我尝试分配字符、字符串,这些类型都可以。地图有什么问题?我做错了什么?

以及C#调用方法

        [DllImport("SheetMetalSample.brx")]
        private static extern void CallCustomObjectGetPropertyValue(IntPtr obj, long objId, out IntPtr Int32mapPtr);

试图找到如何做到这一点的答案,但没有成功。

c# c++ interop
1个回答
0
投票

你不能。

P/Invoke 是 C 风格的 API。有一个 marshaller 可以将某些类型转换为相应的 C 类型,但这仅适用于简单的情况,例如结构或数组。它无法处理像 std::Map 或 Vector 这样的 C++ 对象。

更糟糕的是,C++ 没有应用程序二进制接口(ABI)。因此不同的编译器可能会以不同的方式表示这些对象。这意味着 C++ 甚至可能无法使用其他编译器的 C++ 库。但我编写 C++ 代码已经很长时间了,而且我不是这个主题的专家。

一些可能的替代方案:

  1. 使用 P/Invoke 并将自己限制为 C API
  2. 使用 C++/CLI 为您的 C++ 项目提供 .Net API
  3. 实现 COM API
  4. 在另一个进程中运行本机代码并使用进程间 API。
© www.soinside.com 2019 - 2024. All rights reserved.