【发布时间】:2010-01-27 19:22:39
【问题描述】:
这有点奇怪,也是我第一次涉足 .net 世界,所以我希望我错过了一些基本的东西 :) 背景:
我有一个本机/Qt c++ DLL,我将其打包用于 .NET,在本例中为 C#。我有一个成功使用这个 DLL 的 Qt 应用程序,没有内存泄漏等。我已经为这个库创建了一个 c++/CLI 包装器,我可以通过它成功调用本机代码。但是,我注意到,根据我第一次与托管 DLL(以及本机 DLL)交互的方式,我会看到 AccessViolation 异常。
如果我首先在进程(不是 .net)堆上从本机 DLL 分配一个对象,那么一切都会按预期工作。但是,如果我通过在堆栈上创建来自本机 DLL 的对象与它进行交互,然后在堆上分配一个本机对象,我稍后会在不相关的本机 DLL 代码中获得 AccessViolation 异常。事实上,我只需要分配原生对象(不再引用它)就可以看到这些错误。
堆栈与堆的问题当然可能是一个红鲱鱼,但它是 100% 可重现的,所以看起来至少是一个很好的线索。有小费吗?谢谢!
【问题讨论】:
-
我们能看一些代码吗?你在使用 p/invoke 吗?
-
废话 - 我目前无法访问代码(在另一台机器上),但我没有使用 p/invoke。我从 C++/CLI DLL 直接调用本机 DLL。我一直小心不要将任何指向 gcnew 对象的指针传递到本机代码中——我已经做到了这一点,我使用了 pin_ptr,如下所示。我会尽快发布一些样本 - 抱歉!感谢您的回复。