.NET 9 Emit API生成程序集报错:找不到System.Private.CoreLib
使用.NET 9 Emit API生成程序集时System.Private.CoreLib找不到的解决方法
问题场景
使用.NET 9新的Emit API编程生成可执行程序集,测试代码如下:
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.
解决方法
1. 显式添加核心库引用
生成的程序集需要明确引用System.Private.CoreLib(.NET 9的核心基础库),修改程序集初始化代码:
Assembly coreLibAssembly = typeof(object).Assembly; AssemblyName assemblyName = new AssemblyName("HelloWorldTest") { Version = new Version(1, 0, 0, 0) }; PersistedAssemblyBuilder assemblyBuilder = new(assemblyName, coreLibAssembly);
2. 简化Console方法调用
无需手动加载程序集,直接通过反射获取Console.WriteLine方法,避免路径加载问题:
MethodInfo writeLineMethod = typeof(Console).GetMethod("WriteLine", new[] { typeof(string) })!; ilGenerator.Emit(OpCodes.Ldstr, "Hello, World!"); ilGenerator.Emit(OpCodes.Call, writeLineMethod); ilGenerator.Emit(OpCodes.Ret);
3. 完善PE构建配置
添加目标框架属性,确保运行时能识别依赖环境:
// 添加目标框架标识 CustomAttributeBuilder targetFrameworkAttr = new( typeof(TargetFrameworkAttribute).GetConstructor(new[] { typeof(string) })!, new object[] { ".NETCoreApp,Version=v9.0" }); assemblyBuilder.SetCustomAttribute(targetFrameworkAttr); // 构建PE时包含核心库引用 ManagedPEBuilder peBuilder = new( header: peHeaderBuilder, metadataRootBuilder: new MetadataRootBuilder(metadataBuilder), ilStream: ilStream, mappedFieldData: fieldData, entryPoint: MetadataTokens.MethodDefinitionHandle(methodBuilder.MetadataToken), assemblyReferences: new[] { coreLibAssembly.GetName() } );
4. 确保运行环境正确
生成的可执行文件需要在安装了**.NET 9 Runtime**的环境中运行,无需手动复制核心库文件到程序目录。
内容的提问来源于stack exchange,提问作者Noraa Junker-Wildi
相关产品推荐
相关产品推荐

