繁体   English   中英

从托管代码调用时 C++ DLL 崩溃

[英]C++ DLL crashes when calling from managed code

有一个使用 .NET Framework 3.5 用 C# 编写的 WinForms 应用程序。 此应用程序使用使用以下声明导入的 C++ Dll:

[DllImport(DllName)]
public static unsafe extern int LoadDBData(String dsn, String userid, String password);

此方法使用 SQL 服务器数据库从给定的 ODBC-DSN 导入数据。 当数据库中的数据过多时调用会崩溃。 这个外部 dll 的提供者说发生这种情况是因为 dll 无法获取更多堆大小,我的应用程序应该提供更多堆 memory。

我该如何解决这个问题? 据我所知,从自动垃圾收集中排除组件的唯一可能性是我已经使用过的 unsafe 关键字。 任何想法将不胜感激。

提前致谢

马丁

您不能增加 .NET 中的堆大小。 您可以使用 Process.Start 在 C/C++ 中创建您的 .NET 应用程序调用的 EXE。 您的 c/c++ EXE 只需调用 DLL function 并返回结果(或者如果您有多个 function 它可以使用命令行参数)。 如果您不想要单独的 EXE,您可以尝试使用 RunDll32。

这似乎是供应商库的问题,而不是您的代码。

托管和非托管 memory 应该被认为是完全分离的。 Managed memory is typically memory allocated on a garbage-collected heap, while unmanaged memory is anything else: the ANSI C memory pool allocated through malloc(3), custom memory pools, and garbage-allocated heaps outside the control of the CLI implementation.. .

请注意,以上引用来自Mono 文档,但我相信(如果我没记错的话).NET 通常也是如此。 如果数据被加载到 DLL 的内部数据结构中,那么它应该分配自己的 memory。 如果您提供的缓冲区将填满数据,那么它只会填满您为缓冲区分配的数据(并在编组之前固定)。 那么数据在哪里加载呢?

我怀疑这是特定于 .NET、托管 memory、垃圾收集等。它是本机 DLL 所以它使用常规的非托管 ZCDE818D7B49357F086 当然,.NET 运行时也将使用它在 memory 中的份额,但使用 DLL 的本机应用程序也会这样做。

如果您在 32 位进程中运行,则 .NET 和非托管代码的总堆大小可以限制为 1.5 GB。 没有其他信息很难判断,但您可能已经达到了这个限制。

因此,一种选择是询问您的供应商,他们是否有 64 位版本的库并切换到 64 进程。 在 64 位进程中,memory 几乎是无限的(根据今天的标准)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM