我的解决方案
好的,所以在我的头撞到墙上很多之后——找出 msbuild 属性、条件和项目包含在 ProjectExtensions 部分中不起作用/在 ProjectExtensions 部分中,我想出了一个额外的技巧,使我的 .csproj 工作Visual Studio 2013 [更新 3] 开发人员是否安装了 Office 2010 或 Office 2013(在下面的第二个要点中有详细说明 - VS 2010 中的相同行为不需要,YMMV 用于 VS 2012)。
要使您的项目以这种方式工作,您需要做以下三件事:
手动编辑您的 .csproj 文件并找到所有 office interop 程序集引用 - 确保版本设置为版本“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 的计算机上启动该解决方案。要解决此问题:
- 打开 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 插件 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>
新的 .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”(版本似乎从常规菜单中显示为灰色)。