Как вставить код CIL в C#
можно ли вставить код IL в метод c#?
6 ответов
вот несколько советов
http://www.codeproject.com/KB/dotnet/CLRMethodInjection.aspx
Я просто опубликовано утилита что позволяет автоматически заменять все тела функций C# на встроенные IL, используя пользовательский атрибут. Как и аналогичные утилиты, это работает через ildasm / ILASM туда и обратно, который можно настроить как шаг после сборки. Инструмент также настраивает PDB для сохранения одноступенчатых и установки точек останова на отдельных инструкциях IL в отладчике. Он отличается от некоторых других вкладышей IL в том, что он (только) заменяет для целых функциональных тел, например:
class MyClass
{
[ILFunc(@"
.locals init ([0] int32 i_arg)
ldc.i4.3
ret
")]
int MyFunc(int i_arg)
{
return 3;
}
};
для высокопроизводительных критических методов я попытался использовать DynamicMethod
чтобы улучшить созданный компилятором IL, но обнаружил, что преимущество теряется из-за накладных расходов на вызов делегата. Inline IL дает преимущество ручной настройки IL без этого удара, предполагая, что нет настроек времени выполнения, которые вам действительно понадобятся DynamicMethod
for.
полный исходный код находится в http://www.glennslayden.com/code/c-sharp/inline-il
Если встроенный IL (в том же духе встроенной сборки, поддерживаемой компиляторами C и C++)-это то, что вы ищете, это может быть достигнуто с помощью компиляции после компиляции туда и обратно.
Майк Столл однажды написал инструмент для этого, насколько я знаю, он довольно зрелый:
кроме этого, вы можете использовать F#, который поддерживает встроенный IL.
инструмент вам нужно называется Сесил и является частью проекта Mono.
вы можете получить более подробную информацию об этом здесь: http://www.mono-project.com/Cecil
цитируется с веб-сайта выше:
Сесил-это библиотека, написанная Jb Evain (http://evain.net/blog/) для создания и проверки программ и библиотек в формате ECMA CIL. Он имеет полную поддержку дженериков и поддерживает некоторую отладку формат символов.
на простом английском языке с помощью Cecil вы можете загружать существующие управляемые сборки, просматривать все содержащиеся типы, изменять их на лету и сохранять обратно на диск измененную сборку.
DynamicMethod - это легкий способ сделать это во время выполнения.
компилятор Microsoft C# не поддерживает инъекцию IL во время компиляции, но инструмент для создания кода может сделать это как шаг после компиляции.
Я добавлю свой собственный инструмент в список решений, уже представленных здесь:InlineIL.Фоди!--6-->.
использует Фоды сборка ткацкий инструмент для изменения сборки во время сборки. Это означает, что все, что вам нужно сделать, это установить пакет NuGet, добавить файл конфигурации в свой проект, и все готово.
затем вам предоставляется простой и типобезопасный API для выдачи инструкций IL, которые вы можете смешивать с кодом C#. Я считаю, что проще написать IL таким образом, чем писать текст, и это также более удобно, чем ILGenerator
поскольку каждый код операции получает свой собственный метод только с соответствующими перегрузками.
вот пример, с using static InlineIL.IL.Emit;
:
public static void ZeroInit<T>(ref T value)
where T : struct
{
Ldarg(nameof(value));
Ldc_I4_0();
Sizeof(typeof(T));
Unaligned(1);
Initblk();
}
Это показывает, как получить доступ к initblk
инструкция, которую C# в настоящее время не выставляет.