Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从第三方dll中释放对象?_C#_C# 3.0 - Fatal编程技术网

C# 如何从第三方dll中释放对象?

C# 如何从第三方dll中释放对象?,c#,c#-3.0,C#,C# 3.0,我正在开发一个将RTF转换成html的程序 我正在使用这里找到的DLL 此dll将jpg文件从html保存到特定文件夹, 当我运行程序时,它第一次翻转rtf,并将图像完美地保存到文件夹中 但是当我再次尝试转换它时,我有这个错误 “错误GDI+中出现一般性错误” 我认为这个dll使用了SaveImage方法,为了避免这种情况,你必须释放你创建的图像对象,但我不能修改dll, 有没有办法释放我从这个dll创建的对象? 这是我的密码 RtfVisualImageAdapter imageAdapte

我正在开发一个将RTF转换成html的程序 我正在使用这里找到的DLL

此dll将jpg文件从html保存到特定文件夹, 当我运行程序时,它第一次翻转rtf,并将图像完美地保存到文件夹中 但是当我再次尝试转换它时,我有这个错误 “错误GDI+中出现一般性错误” 我认为这个dll使用了SaveImage方法,为了避免这种情况,你必须释放你创建的图像对象,但我不能修改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);
}

如果某个对象实现了
IDisposable
,则可以调用其
Dispose()
方法。对象一旦超出范围,就有资格进行垃圾收集,因此您也可以尝试在不再有对要“释放”的对象的引用后调用
GC.Collect()

因为您有源代码,所以您可以检查它,找出它在哪里保留引用,并确保它被释放


如果您无法确定在何处执行此操作,则可以在单独的数据库中加载代码,并在其中执行代码。完成后,可以卸载AppDomain,应用程序将释放所有对象。然后为下一次运行重新创建AppDomain

但在使用AppDomains之前,我会尝试花一些时间找出真正的问题


还有一件事。当您两次执行同一个文件或连续执行两个不同的文件时,是否会出现GDI错误?这可能是因为它无法加载第二个文件的映像,并向您提供了错误。

作为Max sez。或者最好使用using构造。永远不要调用GC.Collect,除非您完全确定这样做可以释放一些GB或RAM

代码很松散,保存位图后不会调用Dispose()方法。为了保持对文件的锁定,GDI+使用内存映射文件来避免对分页文件施加压力。这很重要,因为位图可能非常大。由于锁定,再次尝试保存到同一文件失败。GDI+异常消息也是出了名的草率

我认为这个bug位于解释器\Converter\Image\RtfImageConverter.cs的SaveImage()方法中。“convertedImage”位图未被释放。请注意,该方法中的图形对象也不会被释放。通过用using语句包装它们来修复它


通过FxCop运行此代码以捕获类似错误。然后问问自己是否真的想维护这样的代码。

using构造给我一个错误,没有实现dispose方法的对象不能在using构造中。然后这些类没有实现IDispose接口,没有代码访问权限,你不能做任何事,使用reflector检查代码,并尝试查看是否可以模拟错误。是否确定映像的路径正确且进程可以访问该映像?“如果您无法确定在何处执行此操作,则可以在单独的AppDomain中加载代码,并在其中执行代码。完成后,您可以卸载AppDomain,应用程序将释放所有对象。然后重新创建AppDomain以供下次运行。”对不起,我不明白。“还有一件事。当您两次执行同一个文件或连续执行两个不同的文件时,是否会出现GDI错误?这可能是因为它无法加载第二个文件的映像并导致错误。”错误是该文件正被其他应用程序或程序使用。谢谢,您的问题指出错误为:“错误GDI中出现一般性错误+“,这并不意味着它正被另一个进程使用。或者你也会遇到另一个错误?至于appdomains,请阅读我为您提供的开始链接。例如,AppDomains对于要卸载的COM组件非常有用,因为它基本上是卸载资源的唯一方法。创建和释放AppDomains并不像听起来那么简单。但是释放AppDomain是否也会释放非托管资源?@Asher,是的,它会。我以前使用过第三方COM组件,这些组件不稳定,必须发布。你是对的,这不是小事,但一旦你掌握了窍门,这也不是很难:)谢谢你的回复nobugz,'Itenso.Rtf.Converter.Image.RtfImageConvertSettings':using语句中使用的类型必须隐式转换为'System.IDisposable',这是我在尝试用using语句包装它们时遇到的错误。我无法克服这一点。抱歉,但是“问问你自己是否真的想维护这样的代码”是什么意思,你把它放错地方了。不确定您做了什么,只需在Save()调用之后调用convertedImage.Dispose()。