Страницы

Поиск по вопросам

пятница, 28 февраля 2020 г.

Работа с Common Intermediate Language

#net #ide #cil


В последнее время достаточно интересно стало писать на CIL, дабы поближе ознакомиться
со всем тем, с чем я работаю каждый день)

В связи с этим появился вопрос: есть ли какая-нибудь IDE для разработки приложений
на чистом IL, а также чем бы следовало вооружиться для более детального его изучения
(ибо пока в моем арсенале есть только интуиция, с помощью которой я читал IL ранее,
и страничка со списком инструкций на Wikipedia)

Пока что я нашел только расширение для Visual Studio, но оно позволяет лишь интегрировать
инструкции на IL в код на C#, F# или VB, а это не совсем то, что мне хотелось бы видеть
¯\_(ツ)_/¯
    


Ответы

Ответ 1



есть ли какая-нибудь IDE для разработки приложений на чистом IL Как вариант, сделать саму Visual Studio такой IDE, пользуясь пользовательскими шаблонами. I. Шаблон проекта Создадим проект консольного приложения C#, назовем его, скажем, CilProject. В обозревателе решений в контекстном меню проекта вызовем пункт "Выгрузить проект". Там же у выгруженного проекта вызовем пункт "Изменить проект". Найдем в XML узел "$(FrameworkPath)\Ilasm.exe" /NOLOGO /DLL /OUTPUT:"@(IntermediateAssembly)" $(IlAsmCommand) /DEBUG $(IlAsmCommand) /OPTIMIZE $(IlAsmCommand) /KEY:"$(AssemblyOriginatorKeyFile)" Снова загрузим проект (в том же контекстном меню выберем пункт "Перезагрузить проект"). Заменим AssemblyInfo.cs на AssemblyInfo.il: .assembly CilProject { } Заменим Program.cs на Program.il: .method public static void Main() cil managed { .entrypoint .maxstack 1 ldstr "Hello, world!" call void [mscorlib]System.Console::WriteLine(string) call int32 [mscorlib]System.Console::Read() pop ret } Для обоих .il файлов в свойствах установим Действие при сборке - Компилировать. После этого проект должен собираться и запускаться. В Visual Studio выберем Проект - Экспорт шаблона - Шаблон проекта, в диалоговом окне введем имя и описание и установим галку "Автоматически импортировать в Visual Studio". В результате должен получиться такой шаблон CilProject.csproj (для VS 2017 и .NET 4.0): Debug AnyCPU {$guid1$} Exe $safeprojectname$ $safeprojectname$ v4.0 512 true AnyCPU true full false bin\Debug\ DEBUG;TRACE prompt 4 AnyCPU pdbonly true bin\Release\ TRACE prompt 4 "$(FrameworkPath)\Ilasm.exe" /NOLOGO /OUTPUT:"@(IntermediateAssembly)" $(IlAsmCommand) /DEBUG $(IlAsmCommand) /OPTIMIZE $(IlAsmCommand) /KEY:"$(AssemblyOriginatorKeyFile)" Файл шаблона будет помещен в (Мои документы)\Visual Studio 2017\Templates\ProjectTemplates. После этого в окне создания проекта в категории Visual C# появится наш CilProject. Уже можно писать программы (ссылки на сборки вписывать в AssemblyInfo.il, а код добавлять в виде файлов .il с действием при сборке "Компилировать"). II. Шаблон элемента Для удобства создадим также шаблон класса. Добавим файл Class1.il: .class public auto ansi beforefieldinit Class1 extends [mscorlib]System.Object { .method public hidebysig static void Method() cil managed { ret } } В Visual Studio выберем Проект - Экспорт шаблона - Шаблон элемента, в диалоговом окне выберем файл Class1.il, установим галку "Автоматически импортировать в Visual Studio" и введем остальные параметры. Получим zip-файл с шаблоном в каталоге (Мои документы)\Visual Studio 2017\Templates\ItemTemplates, распакуем его и откроем файл .vstemplate. В нем найдем узел и добавим в него атрибут ItemType="Compile": CilClass.il CilClass Class (CIL) CSharp 10 __TemplateIcon.ico Class1.il Запакуем файлы в такой же ZIP-архив и поместим на место старого в каталоге ItemTemplates. Перезапустим студию, после этого в окне добавления элемента, в категории "Элементы Visual C#" появится наш шаблон класса. Результат Что-то такое: Плюсы: работает отладка, вывод ошибок и предупреждений компилятора с указанием файла и строки, можно переключаться между конфигурациями Debug/Release. Минусы: не работают свойства проекта, функционал добавления ссылок через интерфейс студии, подсветка синтаксиса, проверка ошибок во время редактирования и многое другое. Итоговые файлы шаблонов: шаблон проекта, шаблон элемента. чем бы следовало вооружиться для более детального его изучения Утилитой IL Disassembler, документацией класса System.Reflection.Emit.OpCodes, третьим разделом спецификации. Источники Visual Studio Project and item templates How can i load a template I have created in Visual Studio? Are there any examples of compiling CIL code from within a Visual Studio project

Комментариев нет:

Отправить комментарий