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

时间:2013-01-27 20:29:10

标签: msbuild visual-studio-express portable-class-library

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

为避免必须使用umpteen项目文件,所有6个配置都存在于同一个项目文件中。自定义project file以生成名为“Portability”的属性,该属性设置为“PCL”或“Desktop”,如下所示:

<!-- 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>

然后,我们根据上述属性为便携式和桌面式设置了单独的属性组。这就是将项目类型定义为“类库”或“可移植类库”(以及共享的OutputType的{​​{1}}):

Library

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

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

.cs

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

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

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

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.

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

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

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

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

2 个答案:

答案 0 :(得分:10)

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

  

或删除&lt; ProjectTypeGuid&gt;完全元素 - 这将选择“可移植”增强功能,例如用于更改目标框架的UI等等

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

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

答案 1 :(得分:3)

在这里回答:
Visual Studio 2012 Express with Portable Class Library?
在这里:
Share functionality using Portable Class Libraries

  

快递中不支持便携式类库项目   SKU ......需要更高的SKU才能获得全面支持。当然是二进制文件   (例如,使用它作为参考),而不是项目/来源   支持。

我可以想象有一个简单的原因 - 有不同类型的VS2012 Express版本:用于Windows Phone开发,用于桌面应用程序,用于Windows 8应用程序......我打赌Windows Phone Express版本不知道Windows Phone项目类型,反之亦然。这可能是PCL不受支持的简单原因。

虽然可移植类库的想法非常好,但它在很多方面仍然非常有限,例如,就我所知,你不能使用#if xy使用条件编译。如果您真的必须使用Visual Studio Express进行开发,那么最好使用带有引用源文件和条件编译的每个平台的项目。