Что это за исключение? - PullRequest
3 голосов
/ 11 мая 2010

Я получаю это исключение при чтении форм в листе Excel в c #: в строке кода

if (worksheet.Shapes.Count >= iCurrentRowIndex)
{ }

Невозможно привести COM-объект типа 'System .__ ComObject' для типа интерфейса 'Microsoft.Office.Interop.Excel._Worksheet. Эта операция не удалась, потому что QueryInterface вызов на COM компонент для интерфейса с IID '{000208D8-0000-0000-C000-000000000046} не удалось из-за следующей ошибки: Приложение называется интерфейсом, который был назначен для другой темы. (Исключение из HRESULT: 0x8001010E (RPC_E_WRONG_THREAD)).

Отредактировано:

Это приложение отлично работает локально, но при развертывании его на IIS возникает исключение. В чем причина? Я использую код для потока как

string strImageSavedPath = string.Empty;
ThreadStart cbThreadStater = delegate { strImageSavedPath =  CopyToClipBoard(worksheet, (int)iRowindex, strApplicationPath); };
Thread thrd = new Thread(cbThreadStater);
thrd.SetApartmentState(ApartmentState.STA);
thrd.Start();
thrd.Join(); 

Где метод CopyToClipBoard читает изображение предоставленного индекса строки, сохраняет изображение в файловой системе и возвращает путь.

System.InvalidCastException не обработано. Message = "Невозможно привести COM-объект типа 'System .__ ComObject' для типа интерфейса 'Microsoft.Office.Interop.Excel._Worksheet. Эта операция не удалась потому что QueryInterface вызов COM-компонента для интерфейса с IID '{000208D8-0000-0000-C000-000000000046}' не удалось из-за следующая ошибка: приложение вызвало интерфейс, который был встал на другую ветку. (Исключение из HRESULT: 0x8001010E (RPC_E_WRONG_THREAD)). "Source =" Microsoft.Office.Interop.Excel "
Трассировки стека: в Microsoft.Office.Interop.Excel._Worksheet.get_Shapes () в KGD6ExcelReader.ExcelManager.CopyToClipBoard (рабочий лист, Int32 iRowindex, String strApplicationPath) в D: \ ParallelMinds \ Shared \ KGD6ExcelReader \ KGD6ExcelReader \ ExcelManager.cs: линия 522 в KGD6ExcelReader.ExcelManager. <> c__DisplayClass3.b__0 () в D: \ ParallelMinds \ Shared \ KGD6ExcelReader \ KGD6ExcelReader \ ExcelManager.cs: линия 376 в System.Threading.ThreadHelper.ThreadStart_Context (состояние объекта) в System.Threading.ExecutionContext.runTryCode (объект userData) в System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup (TryCode код, CleanupCode backoutCode, Object userData) в System.Threading.ExecutionContext.RunInternal (ExecutionContext выполнениеContext, обратный вызов ContextCallback, состояние объекта) в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта) в System.Threading.ThreadHelper.ThreadStart () InnerException:

Ответы [ 3 ]

1 голос
/ 11 мая 2010

Ссылка на интерфейс COM (возможно, рабочий лист), которую вы пытаетесь использовать, предназначена для прокси-сервера, который находится в другой квартире для текущего потока. См текст ссылки .

Попробуйте сделать ссылку на текущий поток.

1 голос
/ 28 июля 2011

Использование объектов автоматизации Office из IIS не рекомендуется и не поддерживается. Так что тот факт, что ваше приложение работает успешно локально и безуспешно в IIS, не является совершенно неожиданным.

В настоящее время Microsoft не рекомендует и не поддерживает автоматизацию приложений Microsoft Office из любых необслуживаемых, неинтерактивных клиентских приложений или компонентов (включая ASP, ASP.NET, DCOM и NT Services), поскольку Office может работать нестабильно и / или зависать при работе Office в этой среде.

Это не значит, что вы не можете попробовать, но убедитесь, что вы все понимаете в статье поддержки « Рекомендации по серверной автоматизации Office », прежде чем продолжить.

1 голос
/ 11 мая 2010

Код работает в фоновом потоке? Если это так, вам нужно установить ApartmentState для потока в STA - для этого вам нужно будет создать реальный поток и вызвать метод SetApartmentState.

подробнее об этом .

...