Есть ли примеры компиляции кода CIL из проекта Visual Studio


Я понимаю, что меня спросили и ответили, что Visual Studio не поддерживает проекты CIL/MSIL. ПроектMSBuildContrib имеет задачу ILASM, которая позволяет компилировать файлы IL во время сборки.

В Гугле не нашлось примеров, как использовать эту задачу.

Есть ли примеры использования ILASM как части решения Visual Studio? Я понимаю, что #ИЛИДА развивать и поддерживать КСС... цель здесь состоит в том, чтобы скомпилировать некоторые файлы CIL как часть визуального Студийное решение .

2 5
cil

2 ответа:

Можно добавить "проект makefile". Шаблон находится в разделе Visual C++, Общие сведения. Этот тип проекта позволяет задавать пользовательские команды построения для действий построения, очистки и перестроения. Среда будет настроена автоматически, так что вам не придется возиться с путями. IDE C++ также поддерживает создание пользовательского правила сборки, поэтому вы можете автоматически запускать нужный инструмент (ilasm.exe) из расширения имени файла (. il).

Это, однако, примерно так же хорошо, как и получается. Здесь нет автоматическое сопоставление нескольких файлов. il в проекте с одной командой сборки. Написание nmake.exe makefile требуется, чтобы получить это. И будьте осторожны, что поддержка пользовательских правил сборки была нарушена в vs2010.

Я отдал должное Хансу за ответ на этот вопрос, но после некоторых экспериментов у меня есть решение, которое немного ближе к Дому:

КАК СКОМПИЛИРОВАТЬ CIL/MSIL ВНУТРИ VISUAL STUDIO

Следующий хак дает вам проект, который:

  • уважает конфигурацию сборки Debug vs Release в Visual Studio.
  • необязательно подписывает результирующую сборку CIL ключевым файлом, настроенным в настройках проекта.
  • можно добавить к источнику контроль.

Выполните следующие действия:

  1. создайте пустую библиотеку классов C#
  2. в папке решения щелкните правой кнопкой мыши проект и выберите "выгрузить проект"
  3. Щелкните правой кнопкой мыши по выгруженному проекту и выберите "Редактировать проект"
  4. в файле csprof прокрутите вниз до конца и найдите строку с надписью "импорт ... Project= " $(MSBuildBinPath)\Microsoft.Используется CSharp.цели", и заменить его кодом на http://pastebin.com/KEJtyQLu (скопировано ниже)

Вот XML:

  <Import Project="$(MSBuildToolsPath)\Microsoft.Common.targets" />

  <Target Name="CreateManifestResourceNames" />

  <Target Name="CoreCompile" Inputs="$(MSBuildAllProjects);@(Compile);" Outputs="@(IntermediateAssembly);$(NonExistentFile);">
    <GetFrameworkPath>
      <Output TaskParameter="Path" PropertyName="FrameworkPath" />
    </GetFrameworkPath>

    <PropertyGroup>
      <IlAsmCommand>&quot;$(FrameworkPath)\Ilasm.exe&quot; /NOLOGO /DLL /OUTPUT:&quot;@(IntermediateAssembly)&quot; </IlAsmCommand>
    </PropertyGroup>

    <PropertyGroup Condition=" '$(Configuration)' == 'Debug' " >
      <IlAsmCommand>$(IlAsmCommand) /DEBUG </IlAsmCommand>
    </PropertyGroup>

    <PropertyGroup Condition=" '$(Configuration)' == 'Release' " ><IlAsmCommand>$(IlAsmCommand) /OPTIMIZE </IlAsmCommand></PropertyGroup>

    <PropertyGroup Condition=" '$(AssemblyOriginatorKeyFile)' != '' " >
      <IlAsmCommand>$(IlAsmCommand) /KEY:&quot;$(AssemblyOriginatorKeyFile)&quot; </IlAsmCommand>
    </PropertyGroup>

    <Exec Command="$(IlAsmCommand) @(Compile->'&quot;%(FullPath)&quot;', ' ')" 
          Outputs="@(IntermediateAssembly)" />

    <CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''" />

  </Target>