Я пытаюсь использовать Mono.Cecil (версия 0.11.5) для создания сборки IL в виде .EXE,
написанной на C# 12 в .NET 8. Почти вся информация, которую я могу найти по использованию
Mono.Cecil предназначен для .NET Framework.
Если это актуально, хост-компьютер — это Windows 11 с установленной средой выполнения .NET 8 и пакетом SDK. Я использую Rider, и у меня не установлена Visual Studio.
Он создает файл .EXE (источник эмиттера ниже), и IL внутри него кажется правильным.Однако при запуске .EXE я получаю:
Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e' or one of its dependencies. The system cannot find the file specified.
Как заставить его правильно генерировать данные для среды выполнения .NET 8?
// Slightly modified from:
// https://mycodingplace.wordpress.com/201 ... llo-world/
public static void Emit()
{
// Create a new assembly
var assembly = AssemblyDefinition.CreateAssembly(
new AssemblyNameDefinition("HelloWorld", new Version()),
"HelloWorld",
ModuleKind.Console);
// This is the main module you need to work with
var module = assembly.MainModule;
// Create a new type called "Program" and add it to main module
var programType = new TypeDefinition(
"HelloWorld",
"Program",
TypeAttributes.Class | TypeAttributes.Public,
module.Import(typeof(object)));
module.Types.Add(programType);
// create a new method called 'Main' method and add it to 'Program' type
var mainMethod = new MethodDefinition(
"Main",
MethodAttributes.Public | MethodAttributes.Static,
module.Import(typeof(void)));
programType.Methods.Add(mainMethod);
// Get ILProcessor for the method body
var ilProcessor = mainMethod.Body.GetILProcessor();
// Load the string "Hello World" to stack
ilProcessor.Emit(OpCodes.Ldstr, "Hello World");
// Call Console.WrtieLine(string)
var writline = module.ImportReference(
typeof(Console).GetMethod("WriteLine", new[] { typeof(string) }));
ilProcessor.Emit(OpCodes.Call, writline);
// Call Console.ReadKey()
var readKey = module.ImportReference(typeof(Console).GetMethod("Read"));
ilProcessor.Emit(OpCodes.Call, readKey);
// You must pop out the return value before you leave the method
ilProcessor.Emit(OpCodes.Pop);
// Return
ilProcessor.Emit(OpCodes.Ret);
// Because this is an executable assembly, you must define an entry point
assembly.EntryPoint = mainMethod;
// Save the assembly to disk
assembly.Write(@"c:\temp\HelloWorld.exe");
}
Подробнее здесь: https://stackoverflow.com/questions/788 ... ding-syste
Использование Mono.Cecil для создания HelloWorld IL, ориентированного на .NET 8, ошибка при загрузке System.Private.Core ⇐ C#
Место общения программистов C#
1722818425
Anonymous
Я пытаюсь использовать Mono.Cecil (версия 0.11.5) для создания сборки IL в виде .EXE,
написанной на C# 12 в .NET 8. Почти вся информация, которую я могу найти по использованию
Mono.Cecil предназначен для .NET Framework.
Если это актуально, хост-компьютер — это Windows 11 с установленной средой выполнения .NET 8 и пакетом SDK. Я использую Rider, и у меня не установлена Visual Studio.
Он создает файл .EXE (источник эмиттера ниже), и IL внутри него кажется правильным.Однако при запуске .EXE я получаю:
Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e' or one of its dependencies. The system cannot find the file specified.
Как заставить его правильно генерировать данные для среды выполнения .NET 8?
// Slightly modified from:
// https://mycodingplace.wordpress.com/2016/11/10/mono-cecil-hello-world/
public static void Emit()
{
// Create a new assembly
var assembly = AssemblyDefinition.CreateAssembly(
new AssemblyNameDefinition("HelloWorld", new Version()),
"HelloWorld",
ModuleKind.Console);
// This is the main module you need to work with
var module = assembly.MainModule;
// Create a new type called "Program" and add it to main module
var programType = new TypeDefinition(
"HelloWorld",
"Program",
TypeAttributes.Class | TypeAttributes.Public,
module.Import(typeof(object)));
module.Types.Add(programType);
// create a new method called 'Main' method and add it to 'Program' type
var mainMethod = new MethodDefinition(
"Main",
MethodAttributes.Public | MethodAttributes.Static,
module.Import(typeof(void)));
programType.Methods.Add(mainMethod);
// Get ILProcessor for the method body
var ilProcessor = mainMethod.Body.GetILProcessor();
// Load the string "Hello World" to stack
ilProcessor.Emit(OpCodes.Ldstr, "Hello World");
// Call Console.WrtieLine(string)
var writline = module.ImportReference(
typeof(Console).GetMethod("WriteLine", new[] { typeof(string) }));
ilProcessor.Emit(OpCodes.Call, writline);
// Call Console.ReadKey()
var readKey = module.ImportReference(typeof(Console).GetMethod("Read"));
ilProcessor.Emit(OpCodes.Call, readKey);
// You must pop out the return value before you leave the method
ilProcessor.Emit(OpCodes.Pop);
// Return
ilProcessor.Emit(OpCodes.Ret);
// Because this is an executable assembly, you must define an entry point
assembly.EntryPoint = mainMethod;
// Save the assembly to disk
assembly.Write(@"c:\temp\HelloWorld.exe");
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78832407/using-mono-cecil-to-generate-helloworld-il-targeting-net-8-error-loading-syste[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия