Я пытаюсь использовать 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#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Вызовите Mono после завершения первого Mono и верните результат первого Mono.
Anonymous » » в форуме JAVA - 0 Ответы
- 52 Просмотры
-
Последнее сообщение Anonymous
-