Office automation (Interop) on Windows Server 2012

2

I'm successfully using Office automation on Windows Server 2008 R2 with Office 2007 in order to convert Office documents to PDFs. The code is rather simple:

public class WordConvert
{
    /// <summary>
    /// Converts a word file to PDF
    /// </summary>
    /// <param name="sourceFilePath">The path of the word file to convert</param>
    /// <param name="targetFilePath">The path of the PDF output file</param>
    public static void ConvertWord(string sourceFilePath, string targetFilePath)
    {
        object objTragetFileName = targetFilePath;
        Word.Application wordDocument = new Word.Application();
        try
        {
            OpenWord(sourceFilePath, wordDocument);
            SaveAsPDF(ref objTragetFileName, wordDocument);
        }
        finally
        {
            CloseWord(wordDocument);
        }
    }

    private static void OpenWord(object sourceFileName, Word.Application wordDocument)
    {
        wordDocument.Documents.Open(ref sourceFileName);
    }

    private static void SaveAsPDF(ref object targetFileName, Word.Application wordDocument)
    {
        object format = Word.WdSaveFormat.wdFormatPDF;
        wordDocument.ActiveDocument.SaveAs(ref targetFileName, ref format);
    }

    private static void CloseWord(Word.Application wordDocument)
    {
        if (wordDocument != null)
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();

            // 2nd time to be safe
            GC.Collect();
            GC.WaitForPendingFinalizers();

            Word.Documents documents = wordDocument.Documents;
            documents.Close();
            Marshal.ReleaseComObject(documents);
            documents = null;


            Word.Application application = wordDocument.Application;
            application.Quit();
            Marshal.ReleaseComObject(application);
            application = null;
        }
    }
}

The problem is that this code doesn't work on Windows Server 2012. The error received is:

System.Runtime.InteropServices.COMException (0x800706BA): The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)

Running the code as interactive user (console app) works fine but it fails when running from IIS web app or from windows service (even with 'alow service to interact with desktop'). The user running the app has enough permissions (administrator) and the code works fine with Office 2010.

Any ideas?

ms-office
office-interop
asked on Stack Overflow Jan 20, 2013 by basdanny • edited Mar 31, 2014 by Kara

3 Answers

4

I'll probably get downvoted for this answer, but I work in an enterprise environment where we have a product that uses Office Automation, and it is very problematic.

I've done research in this arena, and Microsoft itself recommends against doing Office Automation.

The following is directly from Microsoft's MSDN knowledge base

Microsoft does not recommend or support server-side Automation of Office.

Also

Microsoft does not currently recommend, and does not support, Automation of Microsoft Office applications from any unattended, non-interactive client application or component (including ASP, ASP.NET, DCOM, and NT Services), because Office may exhibit unstable behavior and/or deadlock when Office is run in this environment.

Source: http://support.microsoft.com/kb/257757

answered on Stack Overflow Jan 20, 2013 by Philip Tenn
0

The only solution found is to make the process that invokes Office API to run as interactive. It can be done by just running a console app (not the brightest idea for server solutions) or by creating some background service (e.g., windows service) and set it's station (SetProcessWindowStation).

answered on Stack Overflow Mar 18, 2013 by basdanny
0

One of the reason to see that error message is if server is missing SysWow64 folder. Here a link that might help you understand better.

http://per.lausten.dk/blog/2011/04/excel-automation-on-windows-server-2008-x64.html

answered on Stack Overflow Apr 22, 2016 by messed-up

User contributions licensed under CC BY-SA 3.0