C # - Компилятор кода для .NET & CF.NET - PullRequest
4 голосов
/ 24 февраля 2011

У меня такой же проект, который нужно скомпилировать с помощью .NET и Compact .NET Framework.

  1. Можно создать компилятор C #, который скомпилирует мой проект с обеими платформами?
  2. Некоторые функции отсутствуют в CF.NET Framework, поэтому я создал его сам (создавая классы с точно такими же именами и параметрами, что и в .NET Framework. Если я обозначаю эти классы с таким атрибутом, как[CF35] можно проанализировать проект и:

    • Использовать этот класс при компиляции проекта с использованием CF.NET
    • Игнорировать этот класс при компиляции проекта с использованием .NET

?

Спасибо за все конструктивные ответы.

[РЕДАКТИРОВАТЬ]

Я знаю решениеОн состоит в том, чтобы создать два проекта, ссылающихся на одни и те же файлы. Проблема в том, что вы должны каждый раз компилировать оба вручную. Более того, когда вы добавляете файл в один, вам нужно открыть второй и ссылаться на него тоже, что это просто скучно делать иAccorПоскольку мы работаем над одним и тем же проектом, я бы хотел выполнить эту часть автоматически.

Кажется возможным?


[EDIT 2] Все отлично работает, кроме ... ресурсов файлов!

Итак, чтобы продолжить, у меня есть три проекта:

  • проект разработки (CF.NET)
  • проект выпуска (CF.NET 3.5), включая все файлы через ""
  • проект выпуска (NET 3.5), включая все файлы через ""

Как сказано,все работает нормально, но теперь моя проблема заключается в использовании файлов ресурсов.

Какой метод применяется для его использования?

  • Когда я использую проект разработки, файл ресурсов корректно извлекается
  • Когда я использую два других проекта, ResourceManager генерирует исключение MissingManifestResourceException

Есть идеи?

Ответы [ 4 ]

6 голосов
/ 24 февраля 2011

Вам нужно будет создать различные конфигурации сборки для каждого из них и задать собственный флаг, например USE_CF. Затем оберните ваши пользовательские классы #if USE_CF и #endif, чтобы они игнорировались при компиляции без этого флага

4 голосов
/ 24 февраля 2011

Есть только один компилятор C #, он генерирует одинаковый IL для любой платформы. Чем отличаются эталонные сборки, вы должны использовать версии CF для проекта, который нацелен на CF, версии рабочего стола для проекта, нацеленного на .NET. Что требует двух проектов. Они могут ссылаться на одни и те же файлы исходного кода. Добавление файлов с исходным кодом только для CF теперь, конечно, больше не проблема.

Синхронизация проектов - это функция, доступная в VS2010. Предназначен для Silverlight, бессмысленно для CF-проекта, разумеется, поскольку он больше не поддерживает его.

4 голосов
/ 24 февраля 2011

Основная идея заключается в том, чтобы украсить ваш код директивами компилятора #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 (С этого момента Edit 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 и использовать подстановочный тег , подобный следующему:

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

3 голосов
/ 25 февраля 2011

лучший способ - создать обычную библиотеку классов проекта (.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

...