Interop Microsoft Word - 无法覆盖保存"只读"

时间:2015-09-08 16:02:58

标签: c# garbage-collection office-interop

我看了几个消息来源,但他们似乎在解决问题方面错过了标记。

  

错误:   PFML_Auto_Fax.exe中发生System.Runtime.InteropServices.COMException'   附加信息:此文件是只读的。

代码:

public void Save()
{
    oDoc.Saved = true;
    oDoc.SaveAs2(Path.Combine(Environment.CurrentDirectory, "temp.doc"));// this is where 
    ((_Document)oDoc).Close();
    ((_Application)oWord).Quit();
    System.Runtime.InteropServices.Marshal.ReleaseComObject(oDoc);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(oWord);
    oDoc = null;
    oWord = null;
    GC.Collect();
}

注意:它循环并保存一次,第二个循环将无法在上面指定的行保存!

正如您所看到的,我将文档和应用程序设置为null,然后强制进行垃圾收集,但程序仍然坚持打开它。

问题是我的问题循环一遍又一遍地创建和保存这个特定的文件。但如果它实际上在我想要的时候退出,我就不会有问题。

主要问题:处理退出并保留我新保存的文件,以便我可以在下一个循环中覆盖它并使用它。

类似的问题:

InteropServices.COMException (This file is read-only).

Disposing of Microsoft.Office.Interop.Word.Application

编辑: 这是有问题的循环

foreach (Principal p in principalList)
{
    WordManager wManager = new WordManager(wordDocDir);
    wManager.ReplaceText("XX", DateTime.Now.ToString("dd"));
    wManager.ReplaceText("INSERTNAME1", String.Format("{0} {1} {2}", p.Salutation != null ? p.Salutation.Trim() : "Principal", p.FristName != null ? p.FristName : "", p.LastName !=null ? p.LastName : ""));

    foreach (string key in toReplace.Keys)
    {
        string outkey;
        toReplace.TryGetValue(key, out outkey);
        wManager.ReplaceText(key, p.AdditionalText[Int32.Parse(outkey)]);
    }
    wManager.Save();
    wManager = null;
    GC.Collect();
    fManager.SendFax(p);
}

1 个答案:

答案 0 :(得分:0)

似乎DocX interlop更好。正常的办公室interlop无法结束。