Visual c++ 保护结构指针在传递到非托管dll时不被垃圾回收

Visual c++ 保护结构指针在传递到非托管dll时不被垃圾回收,visual-c++,garbage-collection,dllimport,unmanaged,Visual C++,Garbage Collection,Dllimport,Unmanaged,虚拟代码用于说明: 福安 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)) { dele

虚拟代码用于说明:

福安

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,然后是传递到包装器函数中的其他参数。

这是行不通的,你在疯狂猜测声明,你得到的是非常错误的。请与DLL的所有者联系,并要求提供.h文件、.lib文件,以便您可以链接并同时提供DLL的调试和发布版本。他使用的VS版本非常重要,它必须与你的版本匹配。DLL的所有者不再在商业中,提供的代码是所有者在VisualC++中编写的包装器的一部分,我正在尝试修复它。它在大多数情况下都能工作,只是bar似乎被垃圾收集,因此抛出一个nullref,这在我的应用程序中发生,这意味着它是本地可修复的,不需要dll创建者的任何支持。如果我错了,请纠正我,我对互操作性的了解非常有限。IIRC
new
操作符不会创建垃圾收集的实例,
ref new
gcnew
do。
[...]
[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;
        }
    }
}