You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:34:56