2011-08-30 5 views
0

프로젝트에서 클라이언트가 사용할 수 있도록 서버 쪽에서 ExcelWord을 자동화해야합니다. 샘플 코드 응용 프로그램에서 코드를 실행했는데 모두 제대로 작동하지만 WCF 서비스 내부에서 오류가 발생했습니다.WCF 서비스에서 Office 자동화를 사용하면 예외가 발생합니다

var wordApp = new Word.Application(); 
wordApp.Visible = true; 
wordApp.Documents.Add(); 

wordApp.Selection.PasteSpecial(Link: true, DisplayAsIcon: true); //Throws exception 

var _excelApp = new Excel.Application(); 
_excelApp.Visible = true; 

_excelApp.Worksheets.Add(); //Throws exception 

을 그리고 오류는 다음과 같습니다 :

내 코드는 다음과 같습니다

함께 System.Runtime.InteropServices.COMException이
에 의해 처리되지 않은했다 사용자 코드
헬프 = wdmain11.chm # 24822
메시지 = 지정한 데이터 형식을 사용할 수 없습니다. ,,
& DisplayAsIcon 객체, & 배치 개체, & 링크 객체 Microsoft.Office.Interop.Word.Selection.PasteSpecial에서
(객체 &
는 IconIndex :
소스 = 마이크로 소프트 워드
있는 ErrorCode = -2146822946
스택 트레이스 개체 & 데이터 유형 & IconFileName은 & IconLabel 개체 개체)에서 OfficeApiPlugin.UsingOfficeApiService.DisplyWorksheet
(WorksheetRow []
worksheetD System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke에서
(개체)
인스턴스 ATA) SyncInvokeDisplyWorksheet (물체
이 Object []이 Object []이 Object [] 입력은, 개체 [] & 출력) 시스템에서
.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin (MessageRpc &
RPC)


System.Runtime.InteropServices.COMEx Microsoft.Office.Interop.Excel.ApplicationClass에서
: 0x800A03EC
자료 = Microsoft.Office.Interop.Excel ErrorCode가
=
-2146827284 스택 트레이스 : ception는 사용자
코드
메시지 HRESULT =로부터 처리되지 않은 예외였다 .get_Worksheets() OfficeApiPlugin.UsingOfficeApiService.DisplyWorksheet (WorksheetRow []
worksheetData) C에서에서
: \ 사용자 \ Mahdi7s 문서는 비주얼 스튜디오를 \ \ 2010
프로젝트 \ \ OfficeApiPlugin \ OfficeApiPlugin UsingOfficeApiService.cs \ 라인
(29)System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke에서
SyncInvokeDisplyWorksheet에서 92,268,103,210 (개체, 개체 []이 Object []) (개체
인스턴스를 개체 [] 입력은, 개체 [] & 출력)는 system.serviceModel에서
.Dispatcher.DispatchOperationRuntime.InvokeBegin (MessageRpc &
RPC)

어떻게하면이 오류없이이 작업을 수행 할 수 있습니까?

+0

어떻게 WCF 서비스를 호스팅합니까? – Dyppl

+0

오류는 Word 및 Excel 응용 프로그램이 서버에 설치되어 있지 않음을 나타냅니다. BTW : 나는 항상 서버에서 ** COM interop을 사용하지 않으려 고합니다. OpenXML 인터페이스와 같은 다른 방법을 사용하여 서버에 Word 또는 Excel 문서를 만들려고하지 않고 ** 설치하지 않아도됩니다. Office on your server .... –

+0

@Dyppl : wpf 응용 프로그램 내에서 내 서비스를 호스팅했습니다. – VirtualWorld

답변

0

저는 문제는 클립 보드 (작동이 불어 나오는 작업)가 STA COM 스레드를 사용해야한다는 것입니다. WCF 호출은 MTA 스레드 인 스레드 풀 스레드에서 수행됩니다.

Thread 클래스를 사용하여 자신의 스레드를 스핀 업하고 ApartmentState를 ApartmentState.STA로 설정 한 다음 거기에서 Office 자동화를 수행하십시오. 가장 간단한 것은 자동화가 완료 될 때까지 WCF 스레드를 차단하는 것입니다.

몇 가지 그러나주의해야 할 : 당신이 동시 통화가 많은 경우

  1. 당신이 때마다 새를 STA 스레드의 스레드를 생성하기보다는 회전해야합니다.
  2. 높은 처리량을 얻으려면 서비스 작업을 비동기로 만들고 자동화가 완료되면 신호를 보내는 사용자 지정 IAsyncResult를 만드는 것이 좋습니다. 이렇게하면 자동화가 진행되는 동안 WCF 스레드를 다시 사용할 수 있습니다.
+0

답장을 보내 주셔서 감사합니다. Richard 저는 STA ApartmentState가있는 다른 스레드에서 코드를 실행하려고했습니다. 또한 여러 서비스를 동시에 여러 가지 방법으로 변경했지만 여전히 오류가 있습니다 ... – VirtualWorld

관련 문제