嗨,我在 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);
试图找到如何做到这一点的答案,但没有成功。
你不能。
P/Invoke 是 C 风格的 API。有一个 marshaller 可以将某些类型转换为相应的 C 类型,但这仅适用于简单的情况,例如结构或数组。它无法处理像 std::Map 或 Vector 这样的 C++ 对象。
更糟糕的是,C++ 没有应用程序二进制接口(ABI)。因此不同的编译器可能会以不同的方式表示这些对象。这意味着 C++ 甚至可能无法使用其他编译器的 C++ 库。但我编写 C++ 代码已经很长时间了,而且我不是这个主题的专家。
一些可能的替代方案: