在 VC++ 项目中使用 C# DLL 的内存泄漏

本文关键字:DLL 内存 泄漏 VC++ 项目 | 更新日期: 2023-09-27 18:30:56

我们在C#中创建了一个DLL,用于使用System.Windows.Forms.RichTextBox读取RTF文件。收到RTF文件名后,它会从没有属性的文件中返回文本。

代码提供如下。

namespace RTF2TXTConverter
{
    public interface IRTF2TXTConverter
    {
         string Convert(string strRTFTxt);
    };
    public class RTf2TXT : IRTF2TXTConverter
    {
        public string Convert(string strRTFTxt)
        {
            string path = strRTFTxt;
            //Create the RichTextBox. (Requires a reference to System.Windows.Forms.)
            System.Windows.Forms.RichTextBox rtBox = new System.Windows.Forms.RichTextBox();
            // Get the contents of the RTF file. When the contents of the file are   
            // stored in the string (rtfText), the contents are encoded as UTF-16.  
            string rtfText = System.IO.File.ReadAllText(path);
            // Display the RTF text. This should look like the contents of your file.
            //System.Windows.Forms.MessageBox.Show(rtfText);
            // Use the RichTextBox to convert the RTF code to plain text.
            rtBox.Rtf = rtfText;
            string plainText = rtBox.Text;
            //System.Windows.Forms.MessageBox.Show(plainText);
            // Output the plain text to a file, encoded as UTF-8. 
            //System.IO.File.WriteAllText(@"output.txt", plainText);
            return plainText;
        }
    }
}

转换方法从RTF文件返回纯文本。在VC ++应用程序中,每次我们加载RTF文件时,内存使用量都会继续

增加。每次迭代后,内存使用量增加 1 MB。

我们是否需要在使用后卸载 DLL 并再次加载新的 RTF 文件?富文本框控件是否始终保留在内存中?或任何其他原因....

我们已经尝试了很多,但我们找不到任何解决方案。这方面的任何帮助都将是很大的帮助。

在 VC++ 项目中使用 C# DLL 的内存泄漏

我遇到了类似的问题,不断创建富文本框控件可能会导致一些问题。如果对大量数据重复使用此方法,则会遇到的另一个大问题是,rtBox.Rtf = rtfText;行在第一次使用控件时需要很长时间才能完成(后台会发生一些延迟加载,直到第一次设置文本时才会发生)。

解决此问题的方法是在后续调用中重用控件,通过执行此操作,您只需支付一次昂贵的初始化成本。这是我使用的代码的副本,我在多线程环境中工作,所以我们实际上使用了一个ThreadLocal<RichTextBox>来旧控件。

//reuse the same rtfBox object over instead of creating/disposing a new one each time ToPlainText is called
static ThreadLocal<RichTextBox> rtfBox = new ThreadLocal<RichTextBox>(() => new RichTextBox());
public static string ToPlainText(this string sourceString)
{
    if (sourceString == null)
        return null;
    rtfBox.Value.Rtf = sourceString;
    var strippedText = rtfBox.Value.Text;
    rtfBox.Value.Clear();
    return strippedText;
}

查看重用线程本地富文本框是否会停止每次调用 1MB 的持续增长。