C# - .NET 和 CF.NET 代码编译器

问题描述 投票:0回答:4

我有一个相同的项目,需要使用 .NET 和 Compact .NET Framework 进行编译。

  1. 可以创建一个C# 编译器将编译我的 项目同时使用两个框架?
  2. 某些功能不存在于 CF.NET Framework 所以我创建了它 我自己(创建具有 完全相同的名称和选项 在.NET框架中。如果我装饰这个 具有类似属性的类 [CF35] 可以解析 项目和:

    • 编译时使用该类 使用 CF.NET 的项目
    • 使用编译项目时忽略此类 .NET

感谢所有有建设性的回答。

[编辑]

我知道解决方案包括创建两个引用相同文件的项目。 问题是,您每次都应该手动编译。 此外,当你向一个文件添加一个文件时,你需要打开第二个文件并引用它,这很无聊,而且根据我们有很多人在同一个项目上工作,我想自动完成这部分。

好像可以吗?


[编辑2] 除了...资源文件之外,一切正常!

所以,为了继续,我有三个项目:

  • 开发项目(CF.NET)
  • 发布项目(CF.NET 3.5),包括通过“”的所有文件
  • 发布项目(NET 3.5),包括通过“”的所有文件

如上所述,一切正常,但现在我的问题是使用资源文件。

如何申请使用?

  • 当我使用开发项目时,资源文件被正确检索
  • 当我使用另外两个项目时,ResourceManager 抛出 MissingManifestResourceException

有什么想法吗?

c# .net compact-framework codedom
4个回答
6
投票

您需要为每个配置创建不同的构建配置,并定义一个自定义标志,例如

USE_CF
。 然后用
#if USE_CF
#endif
包装您的自定义类,这样在没有该标志的情况下编译时它们会被忽略


4
投票

基本的想法是用每个框架版本的 #if 编译器指令来装饰你的代码?

#if CFNET
// .net CF code
#else
// .net code
#endif

从这里您有两种选择:

A) 1 个具有自定义构建配置的项目文件

如果您想将所有内容都包含在 1 个 csproj 文件中,则需要手动修改它。由于这是一个 msbuild 文件,这更像是一个 msbuild 问题。我想你需要做以下事情:

  1. 使用 2 个平台名称“NET”和“CF”(而不是默认的任何 CPU 或 x86)
  2. 定义CF常量(从现在开始编辑csproj):

    <PropertyGroup Condition="'$(Platform)' == 'CF'">
         <DefineConstants>CF</DefineConstants>
     </PropertyGroup>

  3. 根据所选平台导入正确的构建目标:

    <Import Condition="'$(Platform)' == 'NET'" Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
     <Import Condition="'$(Platform)' == 'CF'" Project="$(MSBuildToolsPath)\<CFtargets>.targets" />

    我不知道CF的目标文件名,因为我没有安装它。它应该在

    C:\Windows\Microsoft.NET\**.targets

  4. 的某个地方

B) 2 个项目文件,每个文件包含适当的构建配置

正如我最初指出的,以及一些评论者指出的,最好的解决方案是拥有 2 个项目文件,并保持同步。您可以在两个项目文件中拥有相同的源文件。

所以一个想法是(而不是每次手动复制文件列表)

  1. 考虑使用 T4 模板,以保持源文件同步(并有 2 个解决方案,这样就不会提示您每次重新加载整个解决方案)或
  2. 修改两个csproj文件并使用通配符编译标记,如下所示:

    <Compile Include="**/*.cs"/>


4
投票

只有一个 C# 编译器,它为任何平台生成完全相同的 IL。 不同之处在于参考程序集,您必须对面向 CF 的项目使用 CF 版本,对面向 .NET 的项目使用桌面版本。 这需要两个项目。 他们可以引用相同的源代码文件。 添加仅 CF 的源代码文件现在当然不再是问题。

保持项目同步是 VS2010 中提供的一项功能。 适用于 Silverlight,当然对于 CF 项目来说毫无意义,因为它不再支持它。


3
投票

更好的方法是创建普通项目类库 (.NET) 并添加所有代码。然后创建第二个类库项目 (.NET CF),但引用第一个项目中的代码文件(不是复制,而是引用)。然后你最终会得到 2 个 DLL,并且你不必处理令人讨厌的丑陋的编译器指令。您无需额外的工作来维护这两个项目即可获得所需的结果。显然,您需要小心代码中的内容,因为 .NET CF 与 .NET 相比是有限的。我不知道如何使用 Visual Studio 添加文件引用(快捷方式),但我在记事本中打开 proj 文件并使用要包含的文件的相对路径。我已将这种方法用于 .NET/.NET CF 以及 .NET/Silverlight

此外,请查看便携式库工具 CTP http://visualstudiogallery.msdn.microsoft.com/b0e0b5e9-e138-410b-ad10-00cb3caf4981/?localeName=ko-kr

© www.soinside.com 2019 - 2024. All rights reserved.