C# - .NET&的代码编译器CF.NET

时间:2011-02-24 18:45:04

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

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

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

    • 编译时使用此类 使用CF.NET的项目
    • 使用时编译项目时忽略此类 .NET
  3. 感谢所有建设性的答案。

    [编辑]

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

    似乎有可能吗?


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

    所以,为了恢复,我有三个项目:

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

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

    申请使用它的方法是什么?

    • 当我使用开发项目时,正确检索资源文​​件
    • 当我使用其他两个项目时,ResourceManager会抛出MissingManifestResourceException

    有什么想法吗?

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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. 修改两个csproj文件并使用wildcard compile tag,如下所示:

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:3)

更好的方法是创建正常的项目类库(.NET)并添加所有代码。然后创建第二个类库项目(.NET CF),但引用第一个项目中的代码文件(不是复制,而是引用)。然后你最终得到2个DLL,你不必处理令人讨厌的丑陋的编译器指令。您可以获得所需的结果,无需额外的工作来维护这两个项目。显然,您需要小心处理代码中的内容,因为与.NET相比,.NET CF是有限的。我不知道如何使用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