I use .NET 9 to create a .NET assembly/program programatically via the new emit api.
My test code looks like the following:
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);
Upon execution of HelloWorldTest.exe
I get the following error:
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.
How do I reference this assembly correctly. Or how do I get rid of the error.