我正在开发一个将RTF转换为html的程序 我正在使用此处找到的DLL http://www.codeproject.com/KB/recipes/RtfConverter.aspx?fid=1458864&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=3427424&fr=1#xx0xx
此dll将jpg文件从html保存到特定文件夹, 当我运行该程序时,它首次转动rtf并将图像完美地保存到文件夹中 但当我尝试再次转换它时,我遇到了这个错误 “错误GDI +中出现一般错误” 我认为这个DLL使用SaveImage方法,为了避免这种情况你必须释放你创建的Image对象,但我无法修改DLL, 有没有办法释放我从这个DLL创建的对象? 这是我的代码
RtfVisualImageAdapter imageAdapter = new RtfVisualImageAdapter(
@Application.StartupPath + "\\Program Data\\temp\\{0}{1}",
System.Drawing.Imaging.ImageFormat.Jpeg);
RtfImageConvertSettings imageConvertSettings =
new RtfImageConvertSettings(imageAdapter);
RtfImageConverter imageConverter = new RtfImageConverter(imageConvertSettings);
try
{
IRtfDocument rtfDocument = RtfInterpreterTool.BuildDoc(
ConversionText, imageConverter);
RtfHtmlConverter htmlConverter = new RtfHtmlConverter(rtfDocument);
htmlConverter.Settings.ConvertVisualHyperlinks = true;
htmlConverter.Settings.UseNonBreakingSpaces = true;
this.richTextBoxPrintCtrl2.Text = htmlConverter.Convert();
}
catch (Exception exception)
{
MessageBox.Show(this, "Error " + exception.Message, this.Text,
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
答案 0 :(得分:1)
代码很草率,保存后它不会在位图上调用Dispose()方法。这样可以锁定文件,GDI +使用内存映射文件来避免对页面文件施加压力。重要的是因为位图可能非常大。由于锁定,尝试再次保存到同一文件失败。 GDI +异常消息也是众所周知的。
我认为该bug位于Interpreter \ Converter \ Image \ RtfImageConverter.cs,SaveImage()方法中。 “convertedImage”位图不会被处理掉。请注意,同一方法中的Graphics对象也不会被处理掉。通过使用using语句包装它们来修复它。
通过FxCop运行此代码以捕获类似的错误。并且问问自己,是否想要维护这样的代码。
答案 1 :(得分:0)
如果某些内容实现IDisposable
,您可以调用其Dispose()
方法。一旦超出范围,对象就有资格进行垃圾收集,因此在没有更多对您要“释放”的对象的引用后,您也可以尝试调用GC.Collect()
。
答案 2 :(得分:0)
由于您拥有源代码,您可以检查它并找出它保留引用的位置并确保它已被释放。
如果您无法确定在何处执行此操作,则可以在单独的AppDomain中加载代码,然后在那里执行代码。完成后,您可以卸载AppDomain,您的应用程序将释放任何对象。然后为下次运行重新创建AppDomain。
但在使用AppDomains之前,我会花一些时间搞清楚真正的问题。
另一件事。当您执行两次相同的文件或连续执行两个不同的文件时,是否会出现GDI错误?可能是它无法加载第二个文件的图像并给你错误。
答案 3 :(得分:0)
作为Max sez。或者更好地使用using构造。永远不要调用GC.Collect,除非你确定这样做,你将释放几GB或RAM!