对于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它真的可以加载一个项目,尽管条件属性组(其条件不满足)引用的项目类型不是知道吗?
答案 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进行开发,那么最好使用带有引用源文件和条件编译的每个平台的项目。