我使用.NET 9通过新的emit api以编程方式创建.NET程序集/程序。
我的测试代码如下所示:
PersistedAssemblyBuilder assemblyBuilder = new(new AssemblyName("HelloWorldTest"), typeof(object).Assembly);
TypeBuilder typeBuilder = assemblyBuilder.DefineDynamicModule("HelloWorldTest").DefineType("HelloWorldTest", TypeAttributes.Public | TypeAttributes.Class);
MethodBuilder methodBuilder = typeBuilder.DefineMethod("Main", MethodAttributes.Public | MethodAttributes.Static, typeof(void), [typeof(string[])]);
ILGenerator ilGenerator = methodBuilder.GetILGenerator();
Assembly loadedAssembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(typeof(Console).Assembly.Location);
ilGenerator.Emit(OpCodes.Ldstr, "Hello, World!");
ilGenerator.Emit(OpCodes.Call, loadedAssembly.GetType("System.Console").GetMethod("WriteLine", [typeof(string)]));
ilGenerator.Emit(OpCodes.Ret);
typeBuilder.CreateType();
MetadataBuilder metadataBuilder = assemblyBuilder.GenerateMetadata(out BlobBuilder ilStream, out BlobBuilder fieldData);
PEHeaderBuilder peHeaderBuilder = new(imageCharacteristics: Characteristics.ExecutableImage);
ManagedPEBuilder peBuilder = new(
header: peHeaderBuilder,
metadataRootBuilder: new MetadataRootBuilder(metadataBuilder),
ilStream: ilStream,
mappedFieldData: fieldData,
entryPoint: MetadataTokens.MethodDefinitionHandle(methodBuilder.MetadataToken));
BlobBuilder peBlob = new();
peBuilder.Serialize(peBlob);
using FileStream fileStream = new("HelloWorldTest.exe", FileMode.Create, FileAccess.Write);
peBlob.WriteContentTo(fileStream);
执行
HelloWorldTest.exe
后,出现以下错误:
Unhandled Exception: System.IO.FileNotFoundException: The file or assembly “System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e” or one of its dependencies was not found. The system cannot find the specified file.
如何正确引用该程序集。或者我该如何消除该错误。
我认为您遇到的问题是您的计算机中未安装.NET Core 9 SDK。
您应该安装它,然后重试: https://dotnet.microsoft.com/en-us/download/dotnet/9.0