如何从第三方DLL发布对象?

时间:2010-04-11 08:14:10

标签: c# c#-3.0

我正在开发一个将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);
}

4 个答案:

答案 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!