我可以得到一个“有时可移植的”类库项目加载在Visual Studio Express?

对于Noda Time 1.1版,主要目标是构build一个可移植类库的风格,主要是为了支持Windows Phone和Windows Store应用程序。 这意味着失去了一些function,所以我们build立一个桌面configuration和一个PCLconfiguration(对于每个debugging,发布和“签名版本”)。

为了避免不必要的工程文件,所有6个configuration都存在于同一个工程文件中。 项目文件被自定义为生成一个名为“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> 

然后,我们根据上述属性为便携式和桌面使用单独的属性组。 这就是将项目types定义为“类库”或“可移植类库”(以及共享Librarytypes):

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

这通常工作得很好 – 我有不同的解决schemeconfiguration,所以我可以立即构build和testing一切,我只需要将每个新的.cs文件添加到单个项目文件。 所以在Visual Studio 2012 Professional(这是我使用的)下,我非常高兴。

当我尝试在Visual Studio Express(VS2010或VS2012)中加载解决scheme时出现问题。 当解决scheme正在加载时,它会失败并报错,说有些项目无法加载,而构buildPCL版本的两个项目则会生成如下输出:

 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. 

(为了清楚起见,重新格式化)两个项目拒绝加载,所以你甚至不能浏览源代码。

我真的希望,即使Express用户不能构buildPCL版本,他们仍然能够加载解决scheme,浏览源代码,并构build非PCL版本。 MSBuild从命令行工作,但不那么友好。

我尝试删除引用PCL项目configuration的解决schemeconfiguration,这并没有帮助。 奇怪的是,甚至评论出XML元素,就像这样:

 <!-- <ProjectTypeGuids>(Guids as before)</ProjectTypeGuids> --> 

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

如果需要的话,我可以下载生成单独的PCL项目文件的path,但如果可能的话,我真的想避免它 – 这会使正常的开发更加痛苦。 同样,我也可以生成仅支持Express的PCL和解决scheme文件,但是我又宁愿不 – 它只是感觉不对。

虽然理想情况下,我想在2010年和2012年支持VS Express,但如果有一个解决scheme只适用于2012年,这将是一个好的开始。

那么,有没有什么办法说服Visual Studio Express,尽pipe有一个条件属性组(不符合条件)引用它不知道的项目types,它真的可以加载项目?

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

或者完全移除<ProjectTypeGuid>元素 – 这将select“可移植”增强function,例如改变目标框架的UI等

我已经尝试过了,它像梦一样运作。 在安装了所有东西的机器上,您甚至可以在Express下创buildPCL版本! 我已经validation了由此产生的二进制文件真的是PCL,看起来很好。

我不会惊讶地发现我后来遇到了一些问题,但目前这对我来说工作得很好。 如果没有Visual Studio中的增强function,我可以很容易地生活 – 我的项目已经有了非常不同的构buildconfiguration,这让我感到困惑,所以我不认为我获得了很多好处。

这里回答如下:
使用可移植类库的Visual Studio 2012 Express?
和这里:
使用可移植类库共享function

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

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

虽然Portable Class Libraries的概念非常好,但在很多方面还是相当有限的,例如,就我所知,不能使用#if xy进行条件编译。 如果您确实需要使用Visual Studio Express进行开发,那么使用引用的源文件和条件编译来为每个平台使用项目可能会更好。