保护struct-pointer在传递给非托管dll时不会收集垃圾

时间:2014-09-26 11:26:20

标签: visual-c++ garbage-collection dllimport unmanaged

虚拟代码说明:

foo.h中

[...]
[StructLayout(LayoutKind::Sequential)]
public value struct Bar
{
    int in;
    string str;
};

Foo(String^ string); 

private:
    Bar *bar;

Foo.cpp中

[...]
[DllImport("dummy")]
int _stdcall Baz(Bar *bar, [MarshalAs(UnmanagedType::LPStr)]String ^str);

Foo::Foo(String ^str)
{
    bar = new Bar;
    if (bar != nullptr)
    {
        if (!Baz(bar, str))
        {
            delete bar;
            bar= nullptr;
        }
    }
}

偶尔会发生错误,当Baz被调用时,bar会为null,我认为这是因为它会在dll中运行的代码被执行时收集垃圾。

到目前为止,我已经尝试过阅读pin_ptr等,但是我找不到任何关于如何使用它的好资源,当我尝试将成员变量声明为pin_ptr类型时,我得到一个错误,说它不能成为班级成员。

我很失落,如果有人能告诉我如何修复它,为什么需要修复以及修复工作如何,那就太棒了。

编辑: 更多信息; Baz只是众多导入的dll方法之一,几乎每一个都使用相同的参数,这意味着第一个是Bar * bar,后面是传递给包装函数的其他参数。

0 个答案:

没有答案