2010-04-11 5 views
0

은 내가이 DLL은 특정 폴더에 HTML에서 JPG 파일을 저장 여기 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에서 개체를 공개? 내가 프로그램을 실행할 때

을 발견 DLL을 사용하고 를 HTML로 RTF를 변환하는 프로그램을 개발하고 있어요, , 그것은 cinverts 처음 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); 
} 

답변

0

뭔가 IDisposable를 구현하는 경우, 당신은 그것의 Dispose() 메서드를 호출 할 수 있습니다. 개체가 범위를 벗어나 자마자 가비지 수집 대상이되므로 "해제"할 개체에 대한 참조가 더 이상 없으면 GC.Collect()을 호출 해보십시오.

0

소스 코드가 있으므로 조사 할 수 있고 참조가 유지되는 곳을 찾아서 릴리스되었는지 확인할 수 있습니다.

코드 위치를 알아낼 수 없다면 별도의 AppDomain에 코드를로드하고 거기에서 코드를 실행할 수 있습니다. 작업이 끝나면 AppDomain을 언로드 할 수 있으며 응용 프로그램은 모든 개체를 해제합니다. 그런 다음 AppDomain을 다음 실행을 위해 다시 만듭니다.

하지만 AppDomains를 사용하기 전에 실제 문제를 파악하려고 노력할 것입니다.

그리고 또 하나. 동일한 파일을 두 번 실행하거나 두 개의 다른 파일을 연속해서 실행할 때 GDI 오류가 발생합니까? 두 번째 파일의 이미지를로드하지 못하고 오류가 발생했을 수 있습니다.

+0

"이 작업을 수행 할 수없는 경우 별도의 AppDomain에 코드를로드하고 거기에서 코드를 실행할 수 있습니다. 작업을 마쳤 으면 AppDomain을 언로드하여 응용 프로그램에서 개체를 해제하고 다시 만듭니다 다음 실행을위한 AppDomain. " 죄송하지만 이해가 안됩니다. "또 다른 문제 : 동일한 파일을 두 번 실행하거나 두 개의 다른 파일을 연속해서 실행하면 GDI 오류가 발생합니까? 두 번째 파일의 이미지를로드하지 못하고 오류가 발생할 수 있습니다." 오류는 파일이 다른 응용 프로그램이나 프로그램에서 사용 중임을 나타냅니다. 감사합니다. – Mohamed

+0

"오류로 인해 GDI +에서 일반 오류가 발생했습니다. "라는 오류 메시지가 표시됩니다. AppDomains는 기본적으로 언로드하려는 COM 구성 요소에 매우 유용합니다. 기본적으로 언로드 할 수있는 유일한 방법이므로 AppDomains는 매우 유용합니다. 리소스 –

+0

appDomains를 생성하고 출시하는 것은 그다지 쉬운 일이 아니지만 AppDomain을 릴리스해도 관리되지 않는 리소스가 해제됩니까? – Asher

0

최대 max. 또는 using 구문을 더 잘 사용하십시오. 죽지 않는 한 GC.Collect를 호출하지 마십시오. 이렇게하면 몇 GB 나 RAM을 비울 수 있습니다!

+0

사용하는 구문 나를 사용하여 개체를 처리를 구현하지 않는 오류가 발생 사용 – Mohamed

+0

다음 클래스는 IDispose 인터페이스를 구현하지 않으면 액세스하지 않고 아무것도 할 수 없다 코드에 반사경으로 코드를 확인하고 오류를 에뮬레이션 할 수 있는지 확인하십시오. 이미지 경로가 정확하고 프로세스에 액세스 할 수 있습니까? 회신 nobugz에 대한 –

1

코드가 엉성하기 때문에 비트 맵을 저장 한 후 Dispose() 메서드를 호출하지 않습니다. 그 파일에 대한 잠금을 유지, GDI + 페이징 파일에 압력을 가하는 피하기 위해 메모리 매핑 된 파일을 사용합니다. 비트 맵이 상당히 클 수 있기 때문에 중요합니다. 잠금 때문에 같은 파일에 다시 저장하려고하면 실패합니다. GDI + 예외 메시지는 악명이 너무 좋지 않습니다.

버그가 Interpreter \ Converter \ Image \ RtfImageConverter.cs, SaveImage() 메서드에 있다고 생각합니다. "convertedImage"비트 맵은 처리되지 않습니다. 같은 메소드의 Graphics 객체는 처리되지 않습니다. using 문으로 래핑하여 문제를 해결하십시오.

FxCop을 통해이 코드를 실행하면 비슷한 오류를 잡을 수 있습니다. 정말로과 같은 코드를 유지하고 싶다면 스스로에게 물어보십시오.

+0

감사 \t 'Itenso.Rtf.Converter.Image.RtfImageConvertSettings'\t이 'System.IDisposable'로 암시 적으로 변환 할 수 있어야 사용하여 문에 사용 된 유형은 그들을 포장 할 때 내가 오류입니다 using 문. 나는 이것을 극복 할 수 없다. 미안하지만 "정말로 이런 코드를 유지하고 싶다면 스스로에게 물어 보라"는 것은 무엇을 의미합니까? – Mohamed

+0

잘못된 위치에 넣었습니다. 당신이 무엇을했는지, 대신에 Save() 호출 후에 convertedImage.Dispose()를 호출하십시오. –

관련 문제