我可以在Visual Studio Express中加载"有时可移植"的类库项目吗?

Jon*_*eet 36 msbuild visual-studio-express portable-class-library

对于Noda Time版本1.1,主要目标是构建可移植类库的风格,主要是为了支持Windows Phone和Windows应用商店应用.这意味着失去一些功能,因此我们构建了桌面配置和PCL配置(针对每个调试,发布和"签名发布").

为避免必须使用umpteen项目文件,所有6个配置都存在于同一个项目文件中.该项目文件被定制为生成一个名为"便携性"属性,该属性设置为"PCL"或"桌面",就像这样:

<!-- Set the custom Portability property based on configuration -->
<PropertyGroup>
  <Portability Condition="'$(Configuration)' == 'Debug Portable'">PCL</Portability>
  <Portability Condition="'$(Configuration)' == 'Release Portable'">PCL</Portability>
  <Portability Condition="'$(Configuration)' == 'Signed Release Portable'">PCL</Portability>
  <!-- Default to desktop if not explicitly set above -->
  <Portability Condition="'$(Portability)' == ''">Desktop</Portability>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

然后,我们根据上述属性为便携式和桌面式设置了单独的属性组.这是项目类型什么定义为"类库"或"便携式类库"(带沿OutputTypeLibrary,这是共享的):

<!-- Desktop-specific properties -->
<PropertyGroup Condition="'$(Portability)' == 'Desktop'">
  <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
  <TargetFrameworkProfile>Client</TargetFrameworkProfile>
</PropertyGroup>

<!-- PCL-specific properties -->
<PropertyGroup Condition="'$(Portability)' == 'PCL'">
  <MinimumVisualStudioVersion>10.0</MinimumVisualStudioVersion>
  <ProjectGuid>{c78f6992-28d7-45c9-a4c1-6eaa649f3247}</ProjectGuid>
  <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
  <TargetFrameworkProfile>Profile2</TargetFrameworkProfile>
  <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

这通常很有效 - 我有不同的解决方案配置,所以我可以立即构建和测试所有内容,我只需要将每个新.cs文件添加到单个项目文件中.所以在Visual Studio 2012 Professional(这是我使用的)下,我非常高兴.

当我尝试在Visual Studio Express(VS2010或VS2012)中加载解决方案时出现问题.虽然解决方案正在加载,但它失败并且错误地说某些项目无法加载,而构建PCL版本的两个项目则具有如下构建输出:

C:\Path\To\NodaTime.csproj : error  :
     The project file 'C:\Path\To\NodaTime.csproj' cannot be opened.

There is a missing project subtype.
     Subtype: '{786C830F-07A1-408B-BD7F-6EE04809D6DB}'
     is unsupported by this installation.
Run Code Online (Sandbox Code Playgroud)

(为了清楚起见重新格式化.)这两个项目拒绝加载,因此您甚至无法浏览源代码.

我真的希望即使Express用户无法构建PCL版本,他们仍然可以加载解决方案,浏览源代码并构建非PCL版本.MSBuild在命令行中运行,但这并不友好.

我已经尝试删除涉及PCL项目配置的解决方案配置,但这没有帮助.奇怪的是,甚至评论出XML元素,如下所示:

<!-- 
    <ProjectTypeGuids>(Guids as before)</ProjectTypeGuids>
 -->
Run Code Online (Sandbox Code Playgroud)

没有帮助 - 虽然删除该行.就好像Visual Studio实际上并没有将它作为真正的XML文件加载一样.(我没有尝试将带有注释掉元素的版本加载到VS Pro中.)

如果需要的话,我可以沿着生成单独的PCL项目文件的路线走下去,但是如果可能的话我真的想避免它 - 它会使正常的开发更加痛苦.同样,我可以生成仅限Express的PCL和解决方案文件,但我再也不会 - 它只是感觉不对.

理想情况下,我想在2010年和2012年支持VS Express,如果有一个仅适用于2012年的解决方案,那将是一个良好的开端.

那么,有没有办法说服Visual Studio Express它真的可以加载一个项目尽管条件属性组(其条件不满足)引用它不知道的项目类型?

Jon*_*eet 10

David Kean在这里的评论给了我目前正在使用的答案:

或完全删除<ProjectTypeGuid>元素 - 这将选择"可移植"增强功能,例如用于更改目标框架的UI等

我试过了,它就像一场梦.在安装了所有设备的机器上,您甚至可以在Express下构建PCL版本!我已经验证了生成的二进制文件确实是PCL,看起来很好.

我发现后来遇到了一些问题,我不会感到惊讶,但目前这对我来说很好.我可以轻松地在没有Visual Studio的增强功能的情况下生活 - 我的项目已经因为具有非常不同的构建配置而感到困惑,所以我认为无论如何我都没有获得太多好处.