2017-12-21 24 views
3

interop을 사용할 때 COM 개체를 릴리스해야한다는 것을 알고 있습니다. 개발 및 추가 기능, 엑셀 (Excel)과 같은 것들은 약간 다릅니다. 여기 루프가 있는데, Marshal.ReleaseComObject이 필요한지 궁금합니다.Excel Addin을 개발할 때 COM을 출시 하시겠습니까?

foreach (var sheet in results.Sheets) 
      { 
       var newSheet = workbook.AddSheet(); 

       newSheet.SetSheetTabColor(sheet.TabColor); 
       newSheet.SetSheetName(sheet.TabName); 
       newSheet.Cells.SetFont("Calibri", 8); 
       newSheet.FreezeRow(1); 

       var endRow = sheet.Data.GetUpperBound(0) + 1; 
       var endColumn = sheet.Data.GetUpperBound(1) + 1; 

       var writeRange = newSheet.SetWriteRange(1, 1, endRow, endColumn); 



       writeRange.Value2 = sheet.Data; 

       newSheet.AutoFitColumns(); 
       newSheet.RemoveColumn(1); 

       Marshal.ReleaseComObject(newSheet); 

      } 

또한 확장 메소드가있는 라이브러리를 만들었습니다. 나는이 객체의 해제해야합니까,

public static Worksheet AddSheet(this Microsoft.Office.Interop.Excel.Workbook workbook) 
     { 
      var sheets = workbook.Sheets; 

      return sheets.Add(After: sheets[sheets.Count]); 
     } 

내가 workbook.Sheets에서 sheets에 접근하고 있기 때문에 : 한 가지 예는 workbook.AddSheet()AddSheet 이런 모습입니까? 그렇다면 워크 시트를 반환 할 때부터 어디에서? 돌아 오기 전에 풀어줄 수 없나요?

이것은 바보 같은 질문 일 수 있지만 Marshal.ReleaseComObject이 foreach 범위에서 필요하지 않은 경우에도 여전히 거기에 있더라도 상처가 있습니까?

답변

2

Marshal.ReleaseComObject은 COM 개체의 수명을 적시에 또는 특정 순서로 제어해야하는 경우에만 사용됩니다. COM 객체를 우연히 사용하려면 에게이 방법을 전혀 사용하지 말 것을 권합니다.

이 방법은 명시 적으로 관리 코드에서 사용되는 COM 개체 의 수명을 제어하는 ​​데 사용됩니다 here

확인합니다. 이 메서드를 사용하면 리소스에 대한 참조를 적시에 방식으로 유지하는 기본 COM 개체 또는 특정 순서로 개체를 해제해야하는 을 해제해야합니다. 두 번째 질문

내가 workbook.Sheets에서 시트에 접근하고 있기 때문에 약

, 나는이 객체의 를 해제해야합니까? 그렇다면 워크 시트를 반환 할 때부터 어디에서? 내가 돌아 오기 전에 나는 를 풀 수 없다? .NET의 COM 구현 개체를 사용하는 경우 감지 여부, 그래서 당신은 필요가 없습니다NO 명시 적으로 아무것도 해제 참조 카운팅 메커니즘을 사용

. 이에 대한 프레임 워크가 있습니다.

참고 : 해당 용도를 사용하십시오. Close (통합 문서),. Quit (신청서)의 적절한 방출 방법. 당신이 사용할 때. Quit() 응용 프로그램 개체에 대해 Windows에서 Excel 프로세스를 닫습니다 (이렇게하면 모든 리소스가 해제됩니다). Close() 통합 문서를 통해 파일 잠금 해제 ... 특정 Excel 파일을 통해 등.

+0

필자의 경우 사용자가 Excel을 열어 기존 파일에서 추가 기능을 실행하지만 대개 원할 때까지 닫지 않으므로이 경우 닫기 나 종료 할 필요가 없습니다. 옳은? – xaisoft

+0

올바른지, 추가 시나리오에서 이것이 필요하지 않습니다. 사용자가 응용 프로그램을 닫습니다. –