none
被C++原生程序调用的C# dll在运行时怎么关闭并发垃圾回收(concurrent Garbage Collection)? RRS feed

  • 问题

  • 通过查看MSDN文章我知道可以通过配置文件关闭并发垃圾回收(如何:禁用并发垃圾回收)。但我C#应用是一个类库,编译之后被C++原生程序调用。这时我怎么设置C#虚拟机以使我的C# dll在运行时关闭并发垃圾回收呢?我的环境是win7 sp1 64bit,但应用程序是32bit的。.net 4.0.编译器使用的是VS2010
    • 已编辑 2017年12月24日 0:50
    2017年12月24日 0:46

全部回复

  • Hi,

    欢迎在MSDN论坛发帖。

    根据你提供的链接,我们不难发现它所知的并发垃圾回收,并不是在Managed 和 unmanaged 语言之间的并发回收。

    >>公共语言运行时 (CLR) 可以在单独的线程上或在与应用程序相同的线程上同时运行垃圾回收。使用 <gcConcurrent> 元素来指定运行时应如何运行垃圾回收

    这种垃圾回收的机制,是借助于CLR .Net Framework,如果你运行的是传统的C++程序,它是没有.NET 环境,也没有CLR的中间语言,这就谈不上垃圾回收。

    如果你是C++的程序调用C#的dll,在对内存这快有疑惑,你可以看微软官方文档提供的解决方案。

    How to call a managed DLL from native Visual C++ code in Visual Studio.NET or in Visual Studio 2005 

    这里面详细的介绍,一步步是如何实现的。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年12月25日 6:08
    版主
  • 谢谢您的回复。我明白怎么通过native c++调用c# dll.我的程序也是这么做的。不好意思,我没有描述清楚我的问题。我应用程序的exe是原生的C++程序,调用了托管代码的dll。那么我应用程序进程就同时存在非托管内存和托管内存。我想知道的是,怎么让CLR不使用并发模式管理托管内存呢?如果我的主程序也是.net程序就很简单了,通过配置文件就可以改变CLR的运行模式了。但是由于我的主程序不是.net程序,没有配置文件的情下如何关闭并发模式呢?

    • 已编辑 2017年12月25日 6:28
    2017年12月25日 6:21
  • Hi,

    据我所知你在C#中编写的DLL代码,如果是托管的内存,都是有CLR来管理的,是不需要程序员来管理,你现在是想自己手动释放这个托管的内存? 是这意思吗?

    我个人理解,在C#的功能中,我们也是没有办法,自己管理这些内存的,就算我们把某个值等于NULL,这些内存的释放最终也是交给GC释放的,并没有C++的delete 函数 release 这个函数。

    很好奇你问什么要关掉并发模式,是因为managed 和 unmanaged 内存交互的时候,出现问题内存问题吗? 在这里我认为遵循的原则是 那边的内存,就有那边的机制来管理内存,相互不影响。

    Best Regards,

    Hart

    Edit:

    据我所知.NET 提供三种方式添加config文件。

    1. Application Configuration File

    2. Publisher Policy File

    3. Machine Configuration File 。

    下面提到如何加载上面config文件的方式。

    https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/index

    https://docs.microsoft.com/en-us/dotnet/framework/deployment/how-the-runtime-locates-assemblies

    默认情况下面,编译的DLL时是没有config 文件的,我们可以尝试添加一个config文件,然后通过link 的方式告诉CLR,去读取config 文件。 这样就可以关闭Concurrent垃圾,通过config文件来关闭并发垃圾回收。 

    (我现在还没去测试,因为涉及加载link的问题,有什么最新情况,我再通知你。)

    在config文件中添加下面下面代码:

    <configuration>
      <runtime>
        <gcConcurrent enabled="false"/>
      </runtime>
    </configuration>

    下面这个链接是关于如何添加config 文件的。 

    https://msdn.microsoft.com/en-us/library/ms184658.aspx 。  

    关于C++ interop 的问题这个文档总结很多link,在文章的最后面。

    https://docs.microsoft.com/en-us/cpp/dotnet/using-cpp-interop-implicit-pinvoke


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.



    2017年12月27日 6:29
    版主