1

我认为我有一个使用 Microsoft Office Document Imaging 对象模型将 .mdi 文件转换为 PDF 的有效解决方案。解决方案在 Windows 服务中,但现在我遇到了一些错误,我无法跟踪信息。

我得到的例外是:

服务器抛出异常。(来自 HRESULT 的异常:0x80010105 (RPC_E_SERVERFAULT)) System.Runtime.InteropServices.COMException (0x80010105):服务器抛出异常。(来自 HRESULT 的异常:0x80010105 (RPC_E_SERVERFAULT))
在 DocumentStore.Mdi2PDF 的 MODI.DocumentClass.Create(String FileOpen)(字符串路径,字符串 newPath)

然后,在事件查看器中有以下应用程序错误:

错误应用程序 MyWindowsServiceName.exe,版本 1.0.0.0,时间戳 0x4b97f185,错误模块 mso.dll,版本 12.0.6425.1000,时间戳 0x49d65443,异常代码 0xc0000005,错误偏移量 0x0000bd8e,进程 id 0xa5c,应用程序启动时间 0x01cac08cf03。

这是进行转换的方法:

private int? Mdi2PDF(String path, String newPath)
{
    int? pageCount = null;
    string tmpTif = Path.GetTempFileName();

    MODI.Document mdiDoc = new MODI.Document();
    mdiDoc.Create(path);
    mdiDoc.SaveAs(tmpTif,
        MODI.MiFILE_FORMAT.miFILE_FORMAT_TIFF_LOSSLESS,
        MODI.MiCOMP_LEVEL.miCOMP_LEVEL_HIGH);
    mdiDoc.Close(false);

    pageCount = Tiff2PDF(tmpTif, newPath);
    if (File.Exists(tmpTif))
        File.Delete(tmpTif);

    return pageCount;
}

我从调用它的服务中删除了所有线程,因此只有主线程正在初始化 MODI 对象,但仍然出现错误,因此它似乎与线程无关。

我还构建了一个控制台应用程序来转换数百个文档并且没有得到异常。

那么,这似乎是由于创建了太多 MODI 对象的实例,而只是在 Service 中实例化造成的?完全没有道理。

有人对这些错误以及如何进一步调试它们有任何线索吗?

4

2 回答 2

2

There's something interesting here about closing the COMObject after its use or something like that. This might perhaps help, I hope it does.

  1. COMException 0x80010105
  2. Exception from HRESULT: 0x80010105 (RPC_E_SERVERFAULT))

It seems to have something related to disposing objects, either an object disposed too early, or not disposed at all.

Have your ever tried to call the Garbage Collector once in a while throughout your callings to the COM object methods?

I don't know, I'm throwing up everything that gets to my mind, perhaps will it make it end as a solution somewhere! =)

于 2010-03-11T18:14:36.640 回答
1

它崩溃了。这是一只死鹦鹉。Office DLL (mso.dll) 中的 AccessViolation 硬件异常。你几乎没有办法弄清楚它究竟为什么会崩溃,这不是你的代码。但是使用线程绝对是使单线程 COM 服务器崩溃的好方法。任何类型的 Office 代码都符合条件。首先摆脱线程,然后致电 Microsoft 支持。

于 2010-03-10T21:00:38.733 回答