我正在尝试围绕现有的 C++ 共享库创建一个 Mono/.Net 包装器类,但是在执行非托管代码时遇到了问题。尽管我成功调用了库,但非托管代码引发了分段错误。当我从用 C++ 编写的非托管应用程序调用库函数时,不会发生这种情况。
C++ 头文件代码:
extern "C" void some_function();
C++源代码:
void some_function()
{
std::vector<uint8_t> v = std::vector<uint8_t> { 0x00 };
}
C# P/调用代码:
[DllImport("somelib.so", EntryPoint = "some_function")]
public static extern void some_function();
如您所见,没有需要封送处理的参数,因此问题不在于传入的数据。我在这个库中的几个函数中遇到了这个问题,但我也可以毫无问题地调用几个. 通常在尝试分配内存时会发生段错误(至少在一种情况下是用于 std::vector),但并非总是如此。我试图在 gdb 中调试,并注意到从 C# 调用时有 5 个线程,但从 C++ 调用时只有 1 个。我也在 Ubuntu 上用 Mono 做这个,如果这有很大的不同的话。
在实现我的 P/Invoke 调用时我可能遗漏了什么,或者这里还有其他事情吗?
更新:我添加了第二个更简单的示例函数,它与第一个具有相同的问题。
更新:我删除了第一个示例,并提供了一个简单而完整的问题实现。我之前的测试没有让我用值初始化向量。我尝试了几种初始化向量的方法,但都没有。似乎每当为向量中的新项目分配内存时都会发生段错误,包括在初始化期间。