2011-10-16 2 views
0

그래서 다음 코드와 함께 "응용 프로그램이 사용 중입니다"RPC_E_SERVERCALL_RETRYLATER 오류가 계속 발생합니다. 이 정확한 코드가 Word 2003 및 .doc 파일에서 제대로 작동한다는 점은 주목할 가치가 있습니다. 2007로 업그레이드 한 후에는 더 이상 작동하지 않습니다. 섹션 수를 얻는 파일은 ".docx"이며 올바른 버전의 interop을 사용해야합니다. 이 오류는 일반적으로 코드의 임의의 위치에서 발생합니다.MS Word Interop C# RPC_E_SERVERCALL_RETRYLATER 오류

public int GetSectionsCount(string fileName) { 
      wrdApp = new Application(); 
      Object file = fileName; 
      Documents docs = wrdApp.Documents; 
      wrdDoc = docs.Open(ref file, ref oMissing, ref oMissing, 
                 ref oMissing, ref oMissing, ref oMissing, ref oMissing, 
                 ref oMissing, 
                 ref oMissing, 
                 ref oMissing, ref oMissing, ref oMissing, ref oMissing, 
                 ref oMissing, 
                 ref oMissing, 
                 ref oMissing); 
      int count = wrdDoc.Sections.Count; 
      wrdDoc.Close(ref oFalse, ref oMissing, ref oMissing); 
      wrdApp.Quit(ref oFalse, ref oMissing, ref oMissing); 
      Marshal.ReleaseComObject(docs); 
      Marshal.ReleaseComObject(wrdDoc); 
      Marshal.ReleaseComObject(wrdApp); 
      wrdDoc = null; 
      wrdApp = null; 
      return count; 
     } 

예제 스택 트레이스는 :

at Microsoft.Office.Interop.Word.DocumentClass.get_Sections() 
    at MyApplication.WordMerge.split(String fileToSplit, String whereToSave, String quarterExtension, Form1 pb) in\\Projects\\MyApplication\\WordMerge.cs:line 176 
    at MyApplication.PMLettersManager.DoSplits() in \\Projects\\PyForms3\\PMLettersManager.cs:line 179 
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 

코드는 자신의 스레드에서 실행하고 다른 MS 워드 자동화 코드가 동시에 실행되지 않습니다. 업그레이드 이전에 다시 작동했습니다.

편집 : 문제의 파일을 .DOC 대신 .DOC로 저장하면 오류가없고 코드가 정상적으로 작동합니다.

답변

0

해결책을 찾았습니다. .docx 대신 .doc 파일을 저장하고 코드를 실행하려고 시도했지만 오류없이 실행되었습니다. 어떤 이유로 .docx 파일을 사용하면 COM에 심각한 문제가 발생합니다. 다른 방법 (COM 오류 처리 및 메시지 펌프 사용 포함)을 찾지 못했습니다.

0

IIRC, Word COM 구성 요소는 STA 하나이므로 호출을 생성 한 스레드에 대한 호출을 마샬링해야합니다.

메시지를 생성 한 스레드가 메시지를 펌핑하지 않는 경우 마샬링이 발생하지 않아서 발생한 오류가 발생합니다.

+0

Word 2003에서 제대로 작동했습니다. 영향을 미칩니 까? – jle

+0

스레딩이 믹스에 포함되어있을 때 문제는 이미있을 수 있지만 아무런 징후도없고 간단한 변경으로 인해 경쟁 조건에 부딪치게됩니다. 나는 오류가 여전히 발생하는지 확인하기 위해 스레딩을 제거하려고합니다. –

+0

오류가 여전히 발생합니다 ... – jle