Существуют ли примеры компиляции кода CIL из проекта Visual Studio? - PullRequest
5 голосов
/ 01 ноября 2010

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

Googled оказался пустым с примерами использования этой задачи.

Есть ли примеры использования ILASM как части решения Visual Studio? Я понимаю, что #develop и ILIDE поддерживают CIL ... цель здесь - скомпилировать некоторые файлы CIL как часть решения Visual Studio .

Ответы [ 2 ]

13 голосов
/ 02 ноября 2010

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

КАК СОСТАВИТЬ ВНУТРЕННЮЮ СТУДИЮ CIL / MSIL

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

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

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

  1. Создайте пустую библиотеку C # classs
  2. В папке решения щелкните правой кнопкой мыши проект и выберите «Выгрузить проект»
  3. Щелкните правой кнопкой мыши на незагруженном проекте и выберите «Редактировать проект»
  4. В файле csprof выполните прокрутку.вниз и найдите строку с надписью «Import ... Project =" $ (MSBuildBinPath) \ Microsoft.CSharp.targets »и замените ее кодом 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>
1 голос
/ 01 ноября 2010

Вы можете добавить «makefile project». Шаблон находится под Visual C ++, General. Этот тип проекта позволяет вам задавать пользовательские команды сборки для действий Build, Clean и Rebuild. Окружение будет настроено автоматически, поэтому вам не придется путаться с путями. Среда C ++ также поддерживает создание пользовательского правила сборки, поэтому вы можете автоматически запускать нужный инструмент (ilasm.exe) с расширением имени файла (.il).

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

...