Search code examples
c#.netcompiler-constructioncompact-frameworkcodedom

C# - Code compiler for .NET & CF.NET


I've a same project that need to be compiled with .NET and Compact .NET Framework.

  1. It is possible to create a C# compiler that will compile my project with both framework ?
  2. Some feature aren't present in CF.NET Framework so I created it by myself (creating classes having exactly the same name & options that in .NET Framework. If I decore this classes with an attribute like [CF35] it's possible to parse the project and :

    • Use this class when compile the project using CF.NET
    • Ignore this class when compile the project using .NET

?

Thanks for all constructive answers.

[EDIT]

I know the solution that consists to create two projects referencing the same files. Problem is, you should every time compile both manually. Moreover, when you add a file to one, you need to open the second and reference it too, that it's just borring to do and according that we are many people to work on the same project, I would like to do this part automatically.

Seems to be possible?


[EDIT 2] All works fine except ... resources files !

So, to resume, I've three project :

  • the development project (CF.NET)
  • the release project (CF.NET 3.5), including all files via ""
  • the release project (NET 3.5), including all files via ""

As said, all works fine, but now my problem is using Resources files.

What's the method to apply to use it?

  • When I use the development project, Resource file is correctly retrieved
  • When I use the two other projects, ResourceManager throws MissingManifestResourceException

Any idea?


Solution

  • The basic idea would be to decorate your code with #if compiler directives for each framework version?

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

    From here one you have two options:

    A) 1 project file with custom build configurations

    If you would like to have everything in 1 csproj file you'll need to modify it manually. Since this is a msbuild file this is more of a msbuild problem. I figure you would need to do the following things:

    1. Use 2 platform names say "NET" and "CF" (instead of the default Any CPU or x86)
    2. Define CF constant (From now on Edit csproj):

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

    3. Import correct build targets depending on selected platform:

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

      I don't know the targets file name of CF since I don't have it installed. It sould be somewhere in C:\Windows\Microsoft.NET\**.targets

    B) 2 project files each containing the appropriate build configuration

    As I initially pointed out, and also some commenter pointed out, the best solution is to have 2 project files, that you keep in sync. You can have the same source files in both project files.

    So an idea would be (instead of copying the file list manually each time) to

    1. think about using T4 templates, to keep the source files in sync (and have 2 solutions, so you wouldn't be prompted to reload the whole solution each time) or to
    2. modify the two csproj files and use a wildcard compile tag like this:

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