关于#C++#的问题,如何解决?

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

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

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

问题:

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

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

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

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

以下内容部分参考ChatGPT模型:


你可以使用 COM Interop 来解决这个问题。以下是步骤:

  1. 在 C# 项目中,将 A.dll 设置为可互操作性 (Interop)。
  2. 在 C++ 项目中,添加对 A.dll 的引用。
  3. 使用 #import 指令将 A.dll 中的 COM 对象导入到 C++ 项目中。
  4. 在 C++ 代码中,实例化 COM 对象并调用其方法。

下面是一个例子:

#import "A.tlb" raw_interfaces_only

void foo()
{
    CoInitialize(NULL);

    A::IObjectPtr obj(__uuidof(A::Object));
    obj->Method();

    CoUninitialize();
}

其中,"A.tlb" 是由 C# 项目生成的类型库文件,"A::IObjectPtr" 和 "A::Object" 是从类型库中导入的 COM 对象指针和对象类型。"Method" 是 COM 对象中的方法名。

注意事项:

  1. 在 C# 项目中,必须使用 ComVisible(true) 属性将 COM 可见性设置为 true。
  2. 在 C++ 项目中,必须启用 CLR 支持。
  3. 如果 A.dll 中包含的是非托管代码,那么需要使用 P/Invoke 或 C++/CLI 进行封装。

如果我的建议对您有帮助、请点击采纳、祝您生活愉快