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的计算机上启动解决方案.要解决此问题:
另外要记住的一件事 - 特别是如果您使用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"(版本似乎从常规菜单中显示为灰色).