首页 > 解决方案 > C# windows 窗体应用程序 Word 互操作适用于 Windows 7 但不适用于 Windows 10

问题描述

我编写了一个应用程序来帮助用户使用 C# 生成字母。我创建了以富文本格式保存在 SQL Server 数据库中的模板。我的开发机器是 Windows 7,我使用 Visual Studio 2019 来编写应用程序。我使用 NuGet 为 Word 添加互操作引用。该应用程序配置为发布,平台活动(任何 CPU),针对 x86。它是一个 ClickOnce 应用程序,它从单独目录中的共享驱动器安装,但与保存字母的驱动器相同。

该应用程序可以在我的机器上正常运行,但不能从 Windows 10 用户机器上正常运行。当它试图保存文件时,她收到一条错误消息,上面写着“对不起,我们找不到文件”。我们都有 Word 2016。两台机器都是 64 位的。我将这封信保存为 Word 中的备份,然后导出为 PDF。在导出为 PDF 之前,代码无法保存 Word 文档。请看下面的代码片段:

    public static void SaveToWord2(string CoverLetter, string LetterText, string FileSave, 
                                   string BackUpSave, ref string ErrorString)
    {
        try
        {

            Microsoft.Office.Interop.Word.Application oWord = new Microsoft.Office.Interop.Word.Application();
            string HeaderFooterFile = Properties.FileResources.HeaderFooterTemplate;

            Document oDoc = new Document();
            oDoc = oWord.Documents.Add(@HeaderFooterFile);
            oDoc.Activate();
            try
            {
                Clipboard.Clear();
                Clipboard.SetText(CoverLetter, TextDataFormat.Rtf);
                oDoc.ActiveWindow.Selection.Paste();
                Clipboard.Clear();
                Clipboard.SetText(LetterText, TextDataFormat.Rtf);
                oDoc.ActiveWindow.Selection.Paste();
                //01/26/2021 JS having trouble with the save on Pam's machine so going to try to capture the correct error.
                try
                {
                    oDoc.SaveAs(@BackUpSave);
                }
                catch (Exception exBU)
                {
                    ErrorString = "Error trying to save " + @BackUpSave + ": " + exBU.Message;
                }
                try
                {
                    oDoc.ExportAsFixedFormat(@FileSave, WdExportFormat.wdExportFormatPDF);
                }
                catch (Exception exPDF)
                {
                    if (string.IsNullOrEmpty(ErrorString))
                    {
                        ErrorString = "Error trying to save " + @FileSave + " PDF: " + exPDF.Message;
                    }
                    else
                    {
                        ErrorString += " and Error trying to save " + @FileSave + " PDF: " + exPDF.Message;
                    }
                }
            }
            catch (Exception exInner)
            {
                ErrorString = exInner.Message;
                MessageBox.Show(exInner.Message, Properties.LetterResources.SaveToWord, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            Clipboard.Clear();
            oWord.Quit(SaveChanges: 0);
            Marshal.FinalReleaseComObject(oWord);
            //oWord.Visible = true;
        }
        catch (Exception ex)
        {
            ErrorString = ex.Message;
            MessageBox.Show(ex.Message, Properties.LetterResources.SaveToWord, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

该错误发生在 oDoc.SaveAs 行上,但仅在从 Windows 10 计算机运行时发生。最初,我使用了我机器上的互操作,但后来将其更改为 NuGet 互操作,但这并没有解决问题。我尝试将 Embed Interop Types 更改为 False 但这并没有解决任何问题,因此我将其更改回来。互操作引用的 Aliases 属性是全局的,Specific Version 属性是 True。由于富文本,我担心更改文档编写器的类型。该应用程序的其余部分对 Windows 10 用户运行良好。有任何想法吗?

标签: c#winformsms-wordinteropclickonce

解决方案


OpenXML 没有成功,因为它不允许我正确添加标题或导出为 PDF。尽管我非常希望使用 OpenXML,但我最终还是回到了 Word Interop。我可以通过如下设置参考属性来解决问题:

嵌入互操作类型 = False 复制本地 = True

现在,无论哪个操作系统运行该程序,保存都有效。我有上面的部分答案,但忽略了 Copy Local = true 部分。


推荐阅读