gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:00:58 24 4
gpt4 key购买 nike

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

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

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

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

提前致谢

马丁

最佳答案

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

Managed and unmanaged memory should be considered to be completely separate. 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 documentation ,但我相信(如果我没记错的话)一般情况下 .NET 也是如此。如果数据被加载到 DLL 的内部数据结构中,那么它应该分配自己的内存。如果您提供的缓冲区将填满数据,那么它只会填满您为缓冲区分配的数据(并在编码之前固定)。那么数据加载到哪里呢?

关于c# - 从托管代码调用时 C++ DLL 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7082234/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com