跨C#和C+的垃圾收集+/CLI对象 我现在正在研究使用C++/CLI来弥补托管C++与本地、非托管C++代码之间的差距。我要解决的一个特别问题是C和C++中不同的数据类型的转换。

跨C#和C+的垃圾收集+/CLI对象 我现在正在研究使用C++/CLI来弥补托管C++与本地、非托管C++代码之间的差距。我要解决的一个特别问题是C和C++中不同的数据类型的转换。,c#,garbage-collection,c++-cli,C#,Garbage Collection,C++ Cli,在阅读这种桥接方法的使用和涉及的性能影响时,我想知道垃圾收集将如何工作。具体来说,垃圾收集器将如何处理在任意一侧创建的对象的清理,如果它们在“另一侧”被引用/销毁 到目前为止,我已经阅读了关于和的各种文章和论坛问题,这使我相信垃圾收集器在同一进程中运行时应该跨两种类型的代码工作——即,如果一个对象是用C#创建并传递给C++/CLI桥,直到双方的参考资料不再使用,才会收集 在这种情况下,我的问题分为三个部分: 在同一进程中运行时,垃圾收集器可以跨代码的两个部分(C#和C++/CLI)工作,这一结论

在阅读这种桥接方法的使用和涉及的性能影响时,我想知道垃圾收集将如何工作。具体来说,垃圾收集器将如何处理在任意一侧创建的对象的清理,如果它们在“另一侧”被引用/销毁

到目前为止,我已经阅读了关于和的各种文章和论坛问题,这使我相信垃圾收集器在同一进程中运行时应该跨两种类型的代码工作——即,如果一个对象是用C#创建并传递给C++/CLI桥,直到双方的参考资料不再使用,才会收集

在这种情况下,我的问题分为三个部分:

  • 在同一进程中运行时,垃圾收集器可以跨代码的两个部分(C#和C++/CLI)工作,这一结论正确吗
  • 关于1:它在这种情况下是如何工作的(特别是在清理两个代码库引用的对象方面)
  • 是否有关于如何监控垃圾收集器活动的建议,即编写测试以检查何时发生垃圾收集;或监视垃圾收集器本身的程序
  • 我已经对垃圾收集器的工作原理有了一定的了解,所以我这里的问题是针对以下场景的:

    组件

    • 组件A-(用C#编写)
    • 程序集B-(用C++/CLI编写)
    程序执行

  • 对象
    O
    程序集A中创建
  • 对象
    O
    被传递到程序集B中的函数中
  • 组件A中对对象
    O
    的引用被释放
  • 程序集B保留对对象
    O
    的引用
  • 执行结束(即通过程序退出)
  • 程序集B释放对对象
    O
    的引用
  • 提前感谢您对这个问题的任何想法。如果需要进一步的信息,或者某些信息不够清楚,请告诉我

    编辑

    根据请求,我已经写了一个我试图描述的场景的粗略示例。可在PasteBin上找到和代码

    我得出的结论正确吗?垃圾收集器在这两个方面都起作用 在同一进程中运行时的代码部分(C#和C++/CLI)

    是的,一个垃圾收集器在一个进程内同时工作(C#和托管C++)。如果在一个进程中有代码在不同的CLR版本下运行,那么每个CLR版本都会有不同的GC实例

    关于1:在这种情况下它是如何工作的(特别是 在清理两个代码库引用的对象方面)

    我认为GC对于代码是C或C++还是CLI来说是没有关系的(注意GC只管理C++和管理C++代码而非本机C++)。它将以自己的方式工作,而不考虑底层代码的类型。关于释放内存,只要对象不再被引用,GC就会这样做。因此,只要存在引用变量的内容,无论程序集如何,都不会收集该变量。对于本机C++代码,您必须手动释放每个动态分配的内存

    对于如何监控垃圾的活动有什么建议吗 收集器-即编写测试以检查何时发生垃圾收集;或 监视垃圾收集器本身的程序


    您可以使用.Net Profiler之类的工具进行监视。另请看一下

    当代码实际运行时,没有一个是C#或C++/CLI。所有这些都是来自C#和C++/CLI的IL,以及来自与您进行互操作的本机代码的机器代码

    因此,您可以将部分问题改写为:

    • 汇编A-(IL,我们不知道它是用什么写的)
    • 汇编B-(IL,我们不知道它是用什么写的)
    在托管对象中,所有这些对象都将按照相同的规则进行垃圾收集,除非您使用一种机制来阻止它(GC.KeepAlive)。除非将它们固定在内存中,否则它们都可以在内存中移动(因为您将地址传递给非托管代码)


    .NET Prror将给您一些垃圾收集的信息,在性能监视器中,集合将被计数。

    您应该清理C++代码中的任何引用。如果它适用的话,您也应该用C语言来做。如果您提供了一个代码示例,您的问题将是清晰的。+ 1垃圾收集器没有C或C的概念。在这个级别上,所有的东西都是CIL。不是。在这个级别上,它都是机器代码,不管是由抖动还是C++代码生成器生成。@ HANSPASANT在“这个级别”。?在它运行的级别上,当然都是机器代码,但在另一个级别上,IL将是与GC合作的机器代码,其余的则不会。我认为Matt选择哪个级别是“这个级别”更合适。