我的解决方案
好的,经过长时间的摸索和思考——发现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——这是一个严重的错误——因为我们只想针对/嵌入2010互操作类型进行构建(这在2013中可以很好地工作,但我们不希望意外访问某些2013专有属性,然后在2010中无法工作...)
被更新的两个引用是“Microsoft.Office.Interop.Word”和“Office”。
编辑:
看起来我可以将这两个引用设置为SpecificVersion:False,然后手动编辑XML文件将它们降级到“14.0.0.0”(版本似乎从常规菜单中灰色显示)。