无法通过 Azure DevOps Pipeline 使用 Microsoft.Office.Interop.Word 部署 .NET Core 应用程序

问题描述 投票:0回答:1

我在通过 Azure DevOps 管道部署使用 Microsoft.Office.Interop.Word 的 .NET Core 应用程序时遇到问题。在本地,我设法通过 COMReference 使用 Interop Word 比较 Word 文档,解决了之前的 NuGet 包问题。但是,在通过 Azure DevOps 进行部署期间,我遇到了错误。

上下文如下:

Word.Application wordApp = new Word.Application();
            wordApp.Visible = false;
            object wordTrue = (object)true;
            object wordFalse = (object)false;
            object fileToOpen = @"";
            object missing = Type.Missing;
            Word.Document doc1 = wordApp.Documents.Open(ref fileToOpen,
                   ref missing, ref wordFalse, ref wordFalse, ref missing,
                   ref missing, ref missing, ref missing, ref missing,
                   ref missing, ref missing, ref wordTrue, ref missing,
                   ref missing, ref missing, ref missing);

            object fileToOpen1 = @"";
            Word.Document doc2 = wordApp.Documents.Open(ref fileToOpen1,
                   ref missing, ref wordFalse, ref wordFalse, ref missing,
                   ref missing, ref missing, ref missing, ref missing,
                   ref missing, ref missing, ref missing, ref missing,
            ref missing, ref missing, ref missing);

            Word.Document doc = wordApp.CompareDocuments(doc1, doc2, Word.WdCompareDestination.wdCompareDestinationNew, Word.WdGranularity.wdGranularityWordLevel,
            true, true, true, true, true, true, true, true, true, true, "", true);
            doc1.Close(ref missing, ref missing, ref missing);
            doc2.Close(ref missing, ref missing, ref missing);

            // Hides both original and revised documents
            wordApp.ActiveWindow.ShowSourceDocuments = WdShowSourceDocuments.wdShowSourceDocumentsNone;
            wordApp.Visible = true;

最初,我在使用 Microsoft.Office.Interop.Word 包时遇到 NuGet 包错误,这导致我使用 COMReference 作为解决方法。虽然此解决方案在本地运行,但 Azure DevOps 管道在构建过程中失败并出现以下错误:

Error MSB4803: The task "ResolveComReference" is not supported on the .NET Core version of MSBuild.
Error CS0234: The type or namespace name 'Office' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?)

是否有其他方法或解决方案可以使用 Microsoft.Office.Interop.Word 成功部署 .NET Core 应用程序,或者是否有任何解决方法来解决 Azure DevOps 的此问题?任何有关解决此部署错误的指导将不胜感激。

azure azure-devops msbuild azure-web-app-service office-interop
1个回答
0
投票
  1. 检查此 Github Issue quicoli 和 xDaevax 的评论。

  2. 您还可以使用其他库,例如

    OpenXml
    ,而不是
    OfficeIntercop
    ,它们可以很好地与 Azure DevOps 管道配合使用。这是用于比较两个 Word 文档的
    OpenXml
    库的示例。

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;

namespace DocumentComparison
{
    class Program
    {
        static void Main(string[] args)
        {
            string originalFilePath = "path/to/original.docx";
            string revisedFilePath = "path/to/revised.docx";

            try
            {
                using (WordprocessingDocument originalDoc = WordprocessingDocument.Open(originalFilePath, false))
                using (WordprocessingDocument revisedDoc = WordprocessingDocument.Open(revisedFilePath, false))
                {
                    MainDocumentPart mainPartOriginal = originalDoc.MainDocumentPart;
                    MainDocumentPart mainPartRevised = revisedDoc.MainDocumentPart;

                    var altChunkId = "AltChunkId" + DateTime.Now.Ticks.ToString();

                    AlternativeFormatImportPart chunkOriginal = mainPartOriginal.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.WordprocessingML, altChunkId);
                    chunkOriginal.FeedData(System.IO.File.Open(originalFilePath, System.IO.FileMode.Open));

                    AlternativeFormatImportPart chunkRevised = mainPartRevised.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.WordprocessingML, altChunkId);
                    chunkRevised.FeedData(System.IO.File.Open(revisedFilePath, System.IO.FileMode.Open));

                    var docComparer = new DocumentComparer(mainPartOriginal, mainPartRevised);

                    bool isEqual = docComparer.CompareDocuments();
                    Console.WriteLine($"Documents are {(isEqual ? "equal" : "not equal")}");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error: {ex.Message}");
            }
        }
    }

    public class DocumentComparer
    {
        private readonly MainDocumentPart _originalDoc;
        private readonly MainDocumentPart _revisedDoc;

        public DocumentComparer(MainDocumentPart originalDoc, MainDocumentPart revisedDoc)
        {
            _originalDoc = originalDoc;
            _revisedDoc = revisedDoc;
        }

        public bool CompareDocuments()
        {
            // Perform comparison logic here
            // You might traverse through paragraphs, runs, etc., comparing content

            // Example: Comparing the number of paragraphs
            var originalParagraphsCount = _originalDoc.Document.Body.Elements<Paragraph>().Count();
            var revisedParagraphsCount = _revisedDoc.Document.Body.Elements<Paragraph>().Count();

            return originalParagraphsCount == revisedParagraphsCount;
        }
    }
}
  1. 我尝试在我的
    .NET 6.0 Web App
    中将以下代码实现为控制器,并且使用
    VsBuild
    构建管道成功了:-

我的控制器代码:-

using Microsoft.AspNetCore.Mvc;
using Word = Microsoft.Office.Interop.Word;

namespace YourNamespace.Controllers
{
    public class WordController : Controller
    {
        public IActionResult CreateWordDocument()
        {
            Word.Application wordApp = new Word.Application();
            Word.Document doc = wordApp.Documents.Add();

            // Add content to the document
            Word.Paragraph para1 = doc.Content.Paragraphs.Add();
            para1.Range.Text = "Hello, this is a sample document.";

            // Save the document
            string filePath = @"C:Document.docx";
            doc.SaveAs2(filePath);

            // Close the document and the Word application
            doc.Close();
            wordApp.Quit();

            // Return a response to indicate successful document creation
            return Content("Word document created successfully!");
        }
    }
}

我的 DevOps 构建管道:-

trigger:
- master

pool:
  vmImage: 'windows-latest'

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'

steps:
- task: NuGetToolInstaller@1

- task: NuGetCommand@2
  inputs:
    restoreSolution: '$(solution)'

- task: VSBuild@1
  inputs:
    solution: '$(solution)'
    msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactStagingDirectory)"'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

- task: VSTest@2
  inputs:
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

输出:-

enter image description here

enter image description here

  1. 请参阅此MS 问答论坛 MughundhanRaveendran-MSFT 的回答
© www.soinside.com 2019 - 2024. All rights reserved.