Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C++;从托管代码调用时DLL崩溃_C#_C++_Memory_Unmanaged - Fatal编程技术网

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

C# C++;从托管代码调用时DLL崩溃,c#,c++,memory,unmanaged,C#,C++,Memory,Unmanaged,有一个WinForms应用程序是使用.NETFramework 3.5用C#编写的。这个应用程序使用了一个C++ dll,它使用以下声明导入: [DllImport(DllName)] public static unsafe extern int LoadDBData(String dsn, String userid, String password); 此方法使用SQL Server数据库从给定的ODBC-DSN导入数据。当数据库中有太多数据时,调用崩溃。这个外部dll的提供者说这是因为

有一个WinForms应用程序是使用.NETFramework 3.5用C#编写的。这个应用程序使用了一个C++ dll,它使用以下声明导入:

[DllImport(DllName)]
public static unsafe extern int LoadDBData(String dsn, String userid, String password);
此方法使用SQL Server数据库从给定的ODBC-DSN导入数据。当数据库中有太多数据时,调用崩溃。这个外部dll的提供者说这是因为dll无法获取更多的堆大小,我的应用程序应该提供更多的堆内存

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

提前谢谢


Martin

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

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

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

托管内存和非托管内存应该被认为是完全分开的。托管内存通常是在已收集的垃圾上分配的内存 堆,而非托管内存是其他任何东西:ANSIC内存池 通过malloc(3)、自定义内存池和 CLI实现无法控制的垃圾分配堆


请注意,上面的引文来自,但我相信(如果我没有弄错的话)对于.NET一般来说也是如此。如果数据被加载到DLL的内部数据结构中,那么它应该分配自己的内存。如果您提供的缓冲区将被数据填满,那么它将只被分配给缓冲区的数据填满(并在编组之前固定)。那么数据在哪里加载呢?

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

托管内存和非托管内存应该被认为是完全分开的。托管内存通常是在已收集的垃圾上分配的内存 堆,而非托管内存是其他任何东西:ANSIC内存池 通过malloc(3)、自定义内存池和 CLI实现无法控制的垃圾分配堆


请注意,上面的引文来自,但我相信(如果我没有弄错的话)对于.NET一般来说也是如此。如果数据被加载到DLL的内部数据结构中,那么它应该分配自己的内存。如果您提供的缓冲区将被数据填满,那么它将只被分配给缓冲区的数据填满(并在编组之前固定)。那么数据在哪里加载呢?

我怀疑这是特定于.NET、托管内存、垃圾收集等的。它是一个本机DLL,因此使用常规的非托管内存。当然,.NET运行时也将使用其共享的内存,但使用DLL的本机应用程序也会这样做

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


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

我怀疑这是特定于.NET、托管内存、垃圾收集等的。它是本机DLL,因此使用常规的非托管内存。当然,.NET运行时也将使用其共享的内存,但使用DLL的本机应用程序也会这样做

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


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

我也认为这是供应商库的问题。但由于我主要使用托管代码进行开发,供应商的意见让我感到不安。但我试图从excel makro调用该库,它也崩溃了。所以我确信这不是我在C#中调用的问题。我也认为这是供应商库的问题。但由于我主要使用托管代码进行开发,供应商的意见让我感到不安。但我试图从excel makro调用该库,它也崩溃了。所以我相信这不是我打电话给C#的问题。