Office Interop не работает в службе Windows

У меня очень странная проблема с Microsoft Office.

У меня есть общая библиотека, единственная цель которой состоит в том, чтобы открыть любой тип файла документа Word, который ему передается (путем полного пути к файлу ...), и сохранить этот открытый документ Word в виде файла PDF.

Странная проблема заключается в том, что если я использую эту библиотеку из службы Windows, всякий раз, когда она пытается открыть слово document, я получаю нулевое значение ... иначе, документ word никогда не открывается.

Однако, если я использую библиотеку из приложения WPF или Windows Form, у меня никогда не возникает никаких проблем. Я знаю, что есть проблемы с многопоточностью (Single Thread Appartment), однако я понятия не имею, как это исправить, чтобы работать из службы Windows. :( :( :(

Буду признателен за любую помощь! Я получаю следующую ошибку:

Сообщение об исключении: {"В экземпляре объекта не задана ссылка на объект."} (Ссылаясь на слово документ). Внутреннее исключение: ноль; HResult: -2147467261. Данные: ListDictionaryInternal с 0 записями; Трассировка стека: в DocumentConverter.ToPdf (String currentWorkingFolderPath, String pathToDocumentToConvert) в c: \ Файлы проекта ... \ DocumentConverter.cs: строка 209

Итак, вот функция библиотеки. Для этого требуется ссылка на Microsoft Office, созданная средствами Visual Studio Tools for Office.

private string ToPDF(string currentWorkingFolderPath, string pathToDocumentToConvert)
{
    string temporaryPdfFolderPath = Path.GetFullPath(currentWorkingFolderPath + "\\pdf\\");
    string temporaryPdfFilePath = Path.GetFullPath(temporaryPdfFolderPath + "\\pdffile.pdf");

    if (!FileSystem.CreateDirectory(temporaryPdfFolderPath))
    {
        return null;
    }

    try
    {
        Microsoft.Office.Interop.Word.Application wordApplication = new Microsoft.Office.Interop.Word.Application();

        object objectMissing = System.Reflection.Missing.Value;

        wordApplication.Visible = false;
        wordApplication.ScreenUpdating = false;

        FileInfo wordFile = new FileInfo(pathToDocumentToConvert);

        Object fileName = (Object)wordFile.FullName;

        // This is where it breaks when called from windows service. Use the dummy value as a placeholder for optional arguments
        Document wordDocument = wordApplication.Documents.Open(ref fileName, ref objectMissing,            
            true, ref objectMissing, ref objectMissing, ref objectMissing, ref objectMissing,            
            ref objectMissing, ref objectMissing, ref objectMissing, ref objectMissing, ref objectMissing,            
            ref objectMissing, ref objectMissing, ref objectMissing, ref objectMissing);



        object outputFileName = (object)temporaryPdfFilePath;
        object fileFormat = WdSaveFormat.wdFormatPDF ;

        // Save document into PDF Format
        wordDocument.SaveAs(ref outputFileName,
            ref fileFormat, ref objectMissing, ref objectMissing,
            ref objectMissing, ref objectMissing, ref objectMissing, ref objectMissing,
            ref objectMissing, ref objectMissing, ref objectMissing, ref objectMissing,
            ref objectMissing, ref objectMissing, ref objectMissing, ref objectMissing);

        // Close the Word document, but leave the Word application open.
        // doc has to be cast to type _Document so that it will find the
        // correct Close method.                
        object saveChanges = WdSaveOptions.wdDoNotSaveChanges;
        ((_Document)wordDocument).Close(ref saveChanges, ref objectMissing, ref objectMissing);

        wordDocument = null;

        // word has to be cast to type _Application so that it will find
        // the correct Quit method.
        ((Microsoft.Office.Interop.Word._Application)wordApplication).Quit(ref objectMissing, ref objectMissing, ref objectMissing);

        wordApplication = null;

    }
    catch (Exception ex)
    {
        //logging code
        return null;
    }

    return temporaryPdfFilePath;
}

Ответы на вопрос(5)

Ваш ответ на вопрос