Ms word VSTO按需加载

Ms word VSTO按需加载,ms-word,ms-office,vsto,office-addins,Ms Word,Ms Office,Vsto,Office Addins,我有一个Word 2016 VSTO,我使用VS2015开发并使用InstallShield部署到Windows 10机器上。如果我将LoadBehavior设置为3,它将加载并正常工作 我需要的是按需加载。我试过将LoadBehavior设置为9,但没有骰子。创建Word文档(最终加载VSTO)的web应用程序最初是为Word 2010编写的,并且正在使用添加的GUID(C:\myAddIn.VSTO | GUID | vstolocal)将VSTO路径嵌入Word文档中。当VSTO尝试加载时

我有一个Word 2016 VSTO,我使用VS2015开发并使用InstallShield部署到Windows 10机器上。如果我将LoadBehavior设置为3,它将加载并正常工作

我需要的是按需加载。我试过将LoadBehavior设置为9,但没有骰子。创建Word文档(最终加载VSTO)的web应用程序最初是为Word 2010编写的,并且正在使用添加的GUID(C:\myAddIn.VSTO | GUID | vstolocal)将VSTO路径嵌入Word文档中。当VSTO尝试加载时,在Word 2016中打开web应用程序创建的文档会引发此错误:

Microsoft.VisualStudio.Tools.Applications.Runtime.CannotCreateStartupObjectException: 无法创建启动对象myAddin.ThisAddIn的实例

我看到的任何VS2013/2015教程都没有提到在VSTO路径中嵌入GUID;只需将LoadBehavior设置为9

文件->选项->加载项中未列出发布者。VSTO列在非活动加载项下,我希望它在按需加载之前一直处于非活动状态


非常感谢您的帮助。

您是否尝试将LoadBehavior设置为
0x10
=>
首次加载,然后按需加载?这将使Office在您第一次执行加载项时加载它并在内部缓存它。然后将该值更改为
0x9
。。。随后,应用程序将按需加载。

如果您希望代码仅使用某些文档执行,如您描述的(来自注释)

我只希望加载由web创建的Word文档的加载项 应用从“开始”菜单开始的Word不应加载 艾丁

那么,最好使用文档级自定义,而不是外接程序

附加到文档级自定义项的代码将随文档一起加载,并在文档关闭时卸载。可以创建文档级自定义并分发文档,或者稍后使用VSTO的类附加代码

因为在您的情况下,文档是由web应用程序生成的,所以指示使用ServerDocument

以下是MSDN文章的主要内容:

=============================================

将托管代码扩展附加到文档的步骤

  • 在不需要Microsoft Office的项目(如控制台应用程序或Windows窗体项目)中,添加对
    Microsoft.VisualStudio.Tools.Applications.ServerDocument.dll
    Microsoft.VisualStudio.Tools.Applications.Runtime.dll程序集

  • 将以下导入或使用语句添加到代码文件的顶部

    使用Microsoft.VisualStudio.Tools.Applications;
    使用Microsoft.VisualStudio.Tools.Applications.Runtime

  • 调用静态AddCustomization方法

  • 下面的代码示例使用AddCustomization重载。此重载获取文档的完整路径和Uri,该Uri指定要附加到文档的自定义项的部署清单的位置。本例假设桌面上有一个名为WordDocument1.docx的Word文档,部署清单位于桌面上名为Publish的文件夹中

    string documentPath = System.Environment.GetFolderPath(
        Environment.SpecialFolder.Desktop) + @"\WordDocument1.docx";
    int runtimeVersion = 0;
    
    try
    {
        runtimeVersion = ServerDocument.GetCustomizationVersion(documentPath);
    
        // Make sure that this document does not yet have any Visual Studio Tools 
        // for Office customizations.
        if (runtimeVersion == 0)
        {
            string deployManifestPath = System.Environment.GetFolderPath(
                Environment.SpecialFolder.Desktop) + @"\Publish\WordDocument1.vsto";
    
            Uri deploymentManifestUri = new Uri(deployManifestPath);
            ServerDocument.AddCustomization(documentPath, deploymentManifestUri);
            System.Windows.Forms.MessageBox.Show("The document was successfully customized.");
        }
        else
        {
            System.Windows.Forms.MessageBox.Show("The document is already customized.");
        }
    }
    catch (FileNotFoundException)
    {
        System.Windows.Forms.MessageBox.Show("The specified document does not exist.");
    }
    catch (DocumentNotCustomizedException ex)
    {
        System.Windows.Forms.MessageBox.Show("The document could not be customized.\n" +
            ex.Message);
    }
    
  • 生成项目并在要附加自定义项的计算机上运行应用程序。计算机必须安装Visual Studio 2010 Office运行时工具

  • 我应该补充一点,尽管可能很明显,我只希望加载由web应用程序创建的Word文档的加载项。从“开始”菜单中打开Word时不应加载加载项。请再仔细考虑一下。。。如果您只想让代码处理某些文档,为什么不使用文档级自定义?您可以在web应用程序生成文档后,使用ServerDocument类()将VSTO代码附加到文档。谢谢Cindy,我认为文档级别的自定义是我可能需要的。好的,我将其作为“答案”编写,因为其他人可能会遇到类似的问题。稍后,我将清理注释…像文档级外接程序那样嵌入GUID是典型的。GUID来自*.csproj文件中的SolutionID。但我不知道它是如何应用于应用程序级加载项的。当我更改为0x10时,启动屏幕显示加载了加载项(以前没有这样做),但加载文档后仍会抛出“无法创建启动对象的实例…”错误。值得一提的是,我没有引用新加载项中Word文档中嵌入到VSTO路径中的GUID。我假设Word知道只有在包含GUID的情况下才能加载加载项?在您得到错误后,它设置为什么?当您将它设置为
    3
    时,它仍然工作?它保持在0x10,如果我将它设置为3,它将为所有文档加载。