C++ 调用 CLR 封装的 dll,数据量较大时,dispose failed

基于微软的 openxml 封装了一套 C# 的 office 库,生成 dll 名称为 A.dll

为了方便已有 C++ 编程产品 OO 的调用,我用 C++ 的 CLR 对 A.dll 进行了又一次封装,生成 dll 名称为 B.dll

然后用 C++ 写了一个测试 B.dll 的 exe 项目为 C.exe,

问题:

当时数据量不大时,无论 C.exe 是否设置 CLR,程序都能正常使用;

当数据量较大时,如果设置 C.exe 为 CLR,程序能正常使用;

当数据量较大时,如果不设置 C.exe 为 CLR,程序提示 Dispose 失败;

关键是我的既有OO项目为一个大型计算类软件,exe 没办法设置为 CLR 项目,不知道各位同仁是否遇到类似问题,有没有解决方案,此现象背后的机理是怎样,请帮忙解答?

“Devil组”引证GPT后的撰写:

  • 可以看出问题出现在C++项目调用C#库的封装中。当数据量较大时,如果不设置C++项目为CLR,则会提示Dispose失败,这可能是因为C++项目未正确释放C#库的资源所致。而设置为CLR项目则可以正常使用,可能是因为CLR能够更好地处理垃圾回收和资源释放。

针对这个问题,可以考虑以下方案:

  • 在C++项目中正确释放C#库的资源。在使用C#库之前,需要先创建相应的对象,使用完毕后需要调用相应的Dispose方法释放资源。确保在使用C#库时,C++项目能够正确地管理和释放资源。
  • 考虑使用其他方式来进行C++和C#的交互。例如使用COM互操作、使用P/Invoke调用等方式。这些方式都能够在C++和C#之间进行相互调用,同时也能够更好地处理资源的释放和管理。
  • 对于大型计算类软件,可以考虑将整个项目迁移到CLR平台上,使用C#来进行开发。这样能够更好地处理资源的管理和释放,并且也能够更好地利用CLR平台的优势。

总之,针对这个问题,需要仔细检查C++项目和C#库的交互过程,并确保正确地管理和释放资源。如果仍然存在问题,可以考虑使用其他方式进行C++和C#之间的交互,或者考虑将整个项目迁移到CLR平台上。

小魔女参考了bing和GPT部分内容调写:
这个问题可能是由于C.exe没有设置为CLR项目,导致B.dll中的内存没有得到及时释放,从而出现Dispose失败的情况。可以尝试在C.exe中调用B.dll时,在开始和结束的时候,调用GC.Collect()方法,来强制回收B.dll中的内存,看看是否可以解决这个问题。

// 在调用B.dll之前调用
GC.Collect();
// 调用B.dll
// 在调用B.dll之后调用
GC.Collect();

回答不易,记得采纳呀。