【问题标题】:C# - Code compiler for .NET & CF.NETC# - .NET 和 CF.NET 的代码编译器
【发布时间】:2011-02-24 18:45:04
【问题描述】:

我有一个需要使用 .NET 和 Compact .NET Framework 编译的项目。

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

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

?

感谢所有建设性的回答。

[编辑]

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

似乎可以?


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

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

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

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

申请使用方法是什么?

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

有什么想法吗?

【问题讨论】:

    标签: c# .net compiler-construction compact-framework codedom


    【解决方案1】:

    您需要为每个配置创建不同的构建配置,并定义一个自定义标志,如USE_CF。然后用 #if USE_CF#endif 包装你的自定义类,这样在没有该标志的情况下编译时它们会被忽略

    【讨论】:

    • +1。将所有 CF 特殊类放入单个程序集并有条件地引用它可能会更好(您需要手动编辑 csproj 文件,以在引用 AFAIK 上添加条件)。
    • 这个解决方案是一个单一的项目——它只有两个不同的构建配置。 dotnetperls.com/if-elif-endif
    【解决方案2】:

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

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

    从这里你有两个选择:

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

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

    1. 使用 2 个平台名称,例如“NET”和“CF”(而不是默认的 Any 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的某个地方

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

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

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

    1. 考虑使用 T4 模板,以保持源文件同步(并有 2 个解决方案,因此不会每次都提示您重新加载整个解决方案)或
    2. 修改两个 csproj 文件并使用 wildcard compile tag 像这样:

      &lt;Compile Include="**/*.cs"/&gt;

    【讨论】:

    • 这意味着有两个项目,并且在将文件添加到项目时,您也需要手动将其添加到其他项目(并且每次都手动编译),这可能是一个问题。但是原始问题没有回答,我想自动回答。
    • 添加了一些关于msbuild配置的想法
    • 所以想法是,我有一个项目(使用上述指令)并编译它(使用 CF.NET),然后有一个程序将复制所有项目,修改 csproj 文件(通过副本更安全地传递)。然后也编译这个项目(这次使用 .NET,再见,使用新的 csproj 文件)。对我来说没关系,所以我可以创建一个自动完成所有这些事情的程序(复制/修改/编译)吗?
    • 不,这个想法是拥有 1 个项目(或事实上的解决方案)并修改项目的 csproj 文件,以便您可以拥有 2 个构建配置,并在 Visual Studio 中在它们之间切换.
    • 在这条路上走过很多很多次,我可以说 CF 和 FFx 的单个项目文件是个坏主意。这个想法可能听起来不错,但实施的现实并没有成功。创建两个单独的项目文件。是的,您有时必须进行编辑以使它们保持一致,但它是迄今为止最易于维护的解决方案。顺便说一句,您可以手动编辑项目文件以将所有代码文件包含在一个目录中,这样可以节省很多编辑。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      另外,看看 Portable Library Tool CTP http://visualstudiogallery.msdn.microsoft.com/b0e0b5e9-e138-410b-ad10-00cb3caf4981/?localeName=ko-kr

      【讨论】:

      • 当您使用“添加现有项目”时,您可以选择添加按钮旁边的一个小下拉箭头,它会提供“添加为链接”作为选项。这将阻止文件复制并使用文件引用。
      • 我知道这个提示,但正如所说,这意味着每次要重建两个不同的项目,这可能是错误的根源......(如我的编辑中所说;))跨度>
      • 它究竟如何成为错误的来源?您仍然需要为这两种类型的项目生成 dll,并且只有一个代码库。如果你有 CE 的特定代码,那么你应该把它放在 CE 项目中。在单个项目中使用编译器指令会让您非常头疼。没有充分的理由这样做。另外,您仍然必须编写两次代码。至少对于文件引用,您只需编写一次代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      相关资源
      最近更新 更多