簡體   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