VSTO工具:从Office 2010升级到2013

13

我正在为Excel开发一个VSTO工具项目。现在我正在升级我的电脑。
我的"旧"笔记本电脑运行Windows 7 x64,安装了Office 2010和Visual Studio 2012。我的新电脑运行Windows 8 x64,安装了Office 2013和Visual Studio 2012。

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

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

我认为这是由于Office升级导致的。除非真的必要,否则我不想返回Office 2010。

您有什么建议吗?

此致, jpsfs


1
我认为你没有太多选择 - 在安装了Office 2010的计算机上创建的VSTO项目只能在安装了Office 2010的计算机上(同样适用于Office 2013)进行开发。要么在新的Windows 8计算机上安装Office 2010,手动将项目转移到新的Office 2013 VSTO项目中,或者设置一个带有Office 2010的虚拟机用于开发。 - rwisch45
你不能安装Office 2010的VSTO/PIO来解决这个问题吗? - bbqchickenrobot
你有没有想出解决办法?添加PIO似乎只会让我的生活更糟。 - Atl LED
这不是真的 - 在Visual Studio 2010 / Office 2013中,您可以进行注册表修改并针对Word 2013运行/调试Word 2010 / VSTO 4.0插件。 - 但是在Visual Studio 2013中,它试图强制我升级项目。这太糟糕了。 - BrainSlugs83
我应该注意(也许对发帖者有帮助),我正在运行VS 2013,更新3 - 它非常坚决地要求在Office 2013机器上升级项目 - 我正在尝试弄清楚如何使其不这样做... - 但也许这正是你想要的? (甚至只需在VS 2013中升级项目,然后从那里返回到VS2012中工作?) - BrainSlugs83
我找到了问题所在——它让我在装有 Office 2010 或 Office 2013 的计算机上处理 Office 2010 解决方案(在 VS 2013 更新 3 上),我已经更新了下面的答案。 - BrainSlugs83
3个回答

10

我的解决方案

好的,经过长时间的摸索和思考——发现msbuild属性、条件和项目包含在ProjectExtensions部分不起作用,我想出了一个额外的方法,使得我的.csproj文件可以在Visual Studio 2013 [更新3]中工作,无论开发人员安装的是Office 2010还是Office 2013(这个方法详细说明在下面的第二个要点中——这对于VS 2010来说不需要,但对于VS 2012则因人而异)。

为了让你的项目以这种方式工作,你需要做以下三个事情:

  • 手动编辑你的.csproj文件,找到所有的Office Interop程序集引用——确保版本设置为"14.0.0.0"(而不是"15.0.0.0"),并且"SpecificVersion"子元素存在且设置为"False"。

  • 在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的计算机上,它不会启动该解决方案。为了解决这个问题:

    • 打开regedit并导航到HKLM\Software\Microsoft\Office\
    • 将整个15.0分支导出为.reg文件。
    • 在记事本中打开文件,并将所有的注册表路径中的"15.0"更改为"14.0"。
    • 重新保存文件(确保你保存为Unicode格式)。
    • 导入文件并重新启动Visual Studio。——这将允许你使用Office 2013进行调试。

还有一件事需要记住——特别是如果你使用EmbedInteropTypes,请确保在发布构建时,你从安装了Office 2010(而不是2013)的计算机上进行构建,这样发布的程序集就可以针对Office 2010特定的库进行构建。——这将保持两个版本之间的向前和向后兼容性。

再次强调,这对于我来说适用于Word插件——对于Excel插件则因人而异。

原始"答案"(可能包含对其他人有用的细节)

我在上面的评论中提到,我遇到了相反的问题 - 如果用户安装了Office 2013,则VS 2013 Update 3会强制升级我的项目。
你可以尝试安装VS 2013 Update 3(甚至是临时安装在虚拟机中),以及最新版本的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>

新的.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>

在我看来,发生了两件事情:

  • 注册表路径从14.0变为15.0(在VS 2010中很容易解决——只需创建一个匹配的14.0注册表路径,指向您安装Word 2013的位置,然后就可以正常工作)。

  • 宿主包的CLS ID。我不知道Excel是什么,但您可以查找一下。——我更喜欢不改变检入项目的CLS ID,这样可以继续使开发人员针对Word 2010开发和测试该项目,以及那些针对Word 2013进行开发和测试的人。

额外需要注意的是,似乎还更新了两个引用,从14.0变为15.0——这是一个严重的错误——因为我们只想针对/嵌入2010互操作类型进行构建(这在2013中可以很好地工作,但我们不希望意外访问某些2013专有属性,然后在2010中无法工作...)

被更新的两个引用是“Microsoft.Office.Interop.Word”和“Office”。

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


3
这刚刚救了我的一天 - 谢谢!我安装了Office 2010和Office 2013,但仍然需要删除OfficeVersion = 14属性才能阻止Visual Studio强制更新到Office 2013。 - lennartk
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Fuhrmanator
1
我认为在Visual Studio 2013 Update 4中这个方法已经不再适用了,至少在我的Windows 8.1 64位机器上安装了Office 2013后也无法解决。我无法摆脱“错误:无法创建项目,因为与此项目类型相关联的应用程序未安装在此计算机上。您必须安装与此项目类型相关联的Microsoft Office应用程序。” - Fuhrmanator
@Fuhrmanator 我不能代表 VBProj 说话,但它是 msbuild,所以如果你设置了特定版本,它应该存在。如果它不存在,那是因为你没有设置它。-- 如果你在引用属性中设置了它,那么它应该出现在 XML 中。-- 关于更新 4,你升级到更新 4 前它是否正常工作?-- 还是你从来就没能让它工作? - BrainSlugs83
@brainslug83 是的,在更新VS之前,它一直正常工作。我甚至回到了我的svn仓库中一个可用的版本,但仍然没有成功。我没有精力回滚我的VS安装以验证我的假设。 - Fuhrmanator

1
比较晚才看到这个问题 - 我在尝试从一个现有的2010 Word项目中创建一个Word文档项目时遇到了相同的问题。我的解决方法是使用早期的.NET Framework版本(版本4而不是版本4.5)。当我在项目创建向导中选择这个版本时,我可以选择Office 2010应用程序。我对.NET是新手,但似乎对我来说运行得很好。

0
从 VS 菜单中选择:
项目 属性 调试
将“启动操作”更改为“启动外部程序” 输入 Excel.exe 的地址
类似于 C:\Program Files\Microsoft Office\Office15\EXCEL.EXE

兄弟,他打不开这个项目……这样并没有帮助。 - BrainSlugs83
如果您打开项目时遇到“无法调试或运行此项目,因为未安装所需版本的Microsoft Office应用程序”错误,这可能会有所帮助。 - Barrie
也许可以这样做。但是这可能会破坏其他东西(我认为这样做会改变.csproj中的属性,可能会影响针对2010版本的构建等)。从我的上面的答案中可以看出,注册表方法可能是一个愚蠢的hack,但它不会改变.csproj中的任何内容,因此您仍然可以自由地开发和测试两个版本。 - BrainSlugs83

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接