如何为x86和CF.Net目标使用相同的C#2008项目?

时间:2009-01-12 13:56:38

标签: .net compact-framework

我在VS2008中有一个C#项目,我想为两个目标构建 - x86和dot net(CF.Net)的紧凑框架,具体取决于所选的配置(比如Debug / SmartDeviceDebug等)。我该怎么做?我有一个暗示这可以使用命令行和msbuild以某种方式完成,但我感兴趣的是一个在VS2008内工作的解决方案。

请注意暂时我正在为两种目标类型使用两个不同的项目,但它是一项杂务,以保持文件之间的文件同步。将文件添加为链接也没有帮助(它不是可扩展的解决方案,文件的名称和数量变化太频繁。)

任何和所有建议都将不胜感激。

3 个答案:

答案 0 :(得分:3)

我认为csproj必须与根据不同框架构建完全不同。但是,有一些技巧;例如,您可以在csproj中使用通配符。我在protobuf-net中使用它,它基于.NET 2.0 / 3.0 / CF 2.0 / CF 3.5 / Silverlight / Mono构建 - 所以我知道你的意思!

看看我的CF 2.0 csproj;特别是:

<ItemGroup>
    <Compile Include="..\protobuf-net\**\*.cs" />
</ItemGroup>

即。找到主项目中任何级别的所有.cs文件。

答案 1 :(得分:2)

通常,您有两个问题 - 一种类型但不是另一种类型的文件,以及CF和FFx之间不同的引用。这些问题可以通过手动操作项目文件来解决 ,但是要预先警告VS IDE不会理解你这些问题(它不知道它应该重新加载整个项目当你的配置变更)。

你能做什么:

  • 从CF项目开始(你可以从eitehr开始,但这就是我们的工作方式)
  • 添加新配置 - 将其命名为“桌面”或任何您喜欢的内容
  • 修改CF解决方案,使其更加明显(名为Debug CF或其他)
  • 使用文本编辑器打开项目文件(* .csproj)。你会发现几个ItemGroup nodes。这里重要的一点是msbuild支持该节点的条件。

因此,如果项目引用的节点看起来像这样

<ItemGroup>
  <Reference Include="System" />
</ItemGroup>

您可以将其修改为

<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Desktop|AnyCPU' >
  <Reference Include="System, Version=2.0.0.0, Culture=neutral,
       PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL" />
</ItemGroup>

请注意,您必须在此处为其提供完整名称。

然后,您可以类似地修改ItemGroup节点,以便将文件包含到每个项目中。

现在你已经完成了简单的部分。接下来你必须按下PropertyGroup nodes。这是查看CF项目文件和FFx项目文件并将相关节点放入条件父项的问题。请特别注意 ProjectTypeGuids PlatformFamilyName 等内容。

所有这一切,我们发现只需要为我们需要重叠的CF和FFx版本维护单独的项目文件就不那么重要了。

答案 2 :(得分:0)

你不能(至少,我不知道)。

首先,项目引用是按项目进行的,而不是按照所选的配置,因此您不得不坚持使用cf dll,因此无法使用常规框架的功能。

这是一个痛苦的屁股,我理解你的问题,因为我正在遭受它们:(