VSTO工具:Office 2010至2013升级

jps*_*sfs 13 c# vsto visual-studio-2012

我正在开发一个用于Excel的VSTO工具项目.我现在正在升级我的机器.我的"旧"笔记本电脑使用Office 2010和Visual Studio 2012运行Windows 7 x64.我的新机器具有带Office 2013和Visual Studio 2012的Windows 8 x64.

在VS2012上打开我的解决方案时,在新机器中,加载项目时出错:

无法创建项目,因为此计算机上未安装与此项目类型关联的应用程序.您必须安装与此项目类型关联的Microsoft Office应用程序.

我估计这是由于Office升级.除非真的有必要,否则我不想回到Office 2010.

你有什么建议吗?

最好的问候,jpsfs

Bra*_*s83 10

我的解决方案

好吧,所以经过大量的敲击我的头撞墙 - 发现msbuild属性,条件和项目包含在ProjectExtensions部分中不起作用,我想出了一个额外的hack,使我的.csproj工作在Visual Studio 2013 [更新3]开发人员是否安装了Office 2010或Office 2013(详细信息请参见下面的第二个要点 - VS 2010中的相同行为,VSMM的YMMV不需要).

要使您的项目以这种方式工作,您需要执行以下三项操作:

  • 手动编辑.csproj文件并找到所有office互操作程序集引用 - 确保版本设置为版本"14.0.0.0"(而不是"15.0.0.0")并且"SpecificVersion"子元素存在且设为"假".

  • 在Project\ProjectExtensions\VisualStudio\FlavorProperties\ProjectProperties元素下找到"OfficeVersion"属性/值对并将其删除(因此读取的属性OfficeVersion="14.0"- 删除它). - 保留所有其他14.0完整,如果有任何更改为15.0,将其降级回14.0(再次,如果它是一个引用,将SpecificVersion设置为false). - 不要担心更改任何GUID,只要保持原样!

  • 此时,解决方案将在运行Visual Studio 2013的计算机上打开并编译,无论它们是Office 2010还是Office 2013. - 但它不会在运行Office 2013的计算机上启动解决方案.要解决此问题:

    • 打开注册表并导航到HKLM\Software\Microsoft\Office \
    • 将整个15.0分支导出到.reg文件.
    • 在记事本中打开该文件,并将所有注册表路径出现"15.0"更改为"14.0".
    • 重新保存文件(确保将其另存为unicode).
    • 导入文件并重新启动Visual Studio. - 这将允许您开始使用Office 2013进行调试.

另外要记住的一件事 - 特别是如果您使用EmbedInteropTypes,请确保在执行发布/发布版本时,从安装了Office 2010(而不是2013)的计算机执行此操作,以便构建已发布的程序集针对Office 2010特定库. - 这将保持您在两个版本之间具有向后和向前兼容性.

同样,这对我来说是一个Word加载项 - 对于Excel加载项YMMV.

原始"答案"(可能包含其他人的有用详情)

我在上面的评论中提到我遇到了相反的问题 - 如果用户安装了Office 2013,VS 2013 Update 3会强行升级我的项目.

您可以尝试安装VS 2013 Update 3(即使是暂时的,比如在VM中)和最新的VSTO 2012/2013版本,并打开项目,它也应该强制升级您的.我知道你正在使用Excel,我正在使用Word,但它正在升级的部分:

旧的.csproj XML:

<Project ...>
  ...
  <ProjectExtensions>
    <VisualStudio>
      <FlavorProperties GUID="{BAA0C2D2-18E2-41B9-852F-F413020CAA33}">
        <ProjectProperties HostName="Word" HostPackage="{20A848B8-E01F-4801-962E-25DB0FF57389}" OfficeVersion="14.0" VstxVersion="4.0" ApplicationType="Word" Language="cs" TemplatesPath="VSTOTemplates" DebugInfoExeName="#Software\Microsoft\Office\14.0\Word\InstallRoot\Path#WINWORD.EXE" DebugInfoCommandLine="/w" AddItemTemplatesGuid="{51063C3A-E220-4D12-8922-BDA915ACD783}" />
        <Host Name="Word"... />
      </FlavorProperties>
    </VisualStudio>
  </ProjectExtensions>
  ...
</Project>
Run Code Online (Sandbox Code Playgroud)

新的.csproj XML:

<Project ...>
  ...
  <ProjectExtensions>
    <VisualStudio>
      <FlavorProperties GUID="{BAA0C2D2-18E2-41B9-852F-F413020CAA33}">
        <ProjectProperties HostName="Word" HostPackage="{29A7B9D7-A7F1-4328-8EF0-6B2D1A56B2C1}" OfficeVersion="15.0" VstxVersion="4.0" ApplicationType="Word" Language="cs" TemplatesPath="VSTOTemplates" DebugInfoExeName="#Software\Microsoft\Office\15.0\Word\InstallRoot\Path#WINWORD.EXE" DebugInfoCommandLine="/w" AddItemTemplatesGuid="{51063C3A-E220-4D12-8922-BDA915ACD783}" />
        <Host Name="Word"... />
      </FlavorProperties>
    </VisualStudio>
  </ProjectExtensions>
  ...
</Project>
Run Code Online (Sandbox Code Playgroud)

在我看来,改变的两件事是:

  • 从14.0到15.0的注册表路径(在VS 2010中很容易解决 - 您刚刚创建了一个匹配的14.0注册表路径,指向您安装Word 2013的位置并且它工作正常).

  • 主机包的CLS ID.我不知道它们是什么用于Excel,但你可以查找它们. - 我不想更改已签入项目的CLS ID,以便开发和测试Word 2010项目的开发人员可以继续这样做,以及那些针对Word 2013开发和测试的开发人员.

另外注意看起来两个引用也从14.0更新到15.0 - 这是一个重要的禁忌 - 因为我们只想构建/嵌入2010 Interop类型(这些在2013年工作正常,但我们不喜欢我不想偶然访问一些2013年的财产,然后让它在2010年不起作用......)

更新的两个引用是"Microsoft.Office.Interop.Word"和"Office".

编辑: 看起来我可以将这两个引用设置为SpecificVersion:False,然后手动编辑XML文件以将它们退回到"14.0.0.0"(版本似乎从常规菜单中显示为灰色).

  • 这只是救了我的一天 - 谢谢!我安装了Office 2010和Office 2013,但仍然必须删除OfficeVersion = 14属性以阻止Visual Studio强制更新到Office 2013. (3认同)