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

.NET Core 6控制台程序切换64位后JIT编译器加载失败求助

.NET Core 6控制台程序内存异常与JIT加载错误排查方案

问题背景

在VS 2022开发的.NET Core 6控制台程序中,读取SQL Server大Blob数据时抛出System.OutOfMemoryException,推测是32位运行环境内存限制导致。切换为64位发布(已验证CPU为64位)后,运行生成的.exe时出现「Fatal Error: Failed to Load JIT Compiler?」错误,无法正常启动程序。环境为Windows 11 + VS 2022。

原始异常堆栈

error: System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.Data.SqlClient.TdsParserStateObject.TryReadPlpBytes(Byte[]& buff, Int32 offset, Int32 len, Int32& totalBytesRead)
at System.Data.SqlClient.TdsParser.TryReadSqlValue(SqlBuffer value, SqlMetaDataPriv md, Int32 length, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlDataReader.TryReadColumnInternal(Int32 i, Boolean readHeaderOnly)
at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i)
at System.Data.SqlClient.SqlDataReader.GetValue(Int32 i)
at System.Data.SqlClient.SqlDataReader.get_Item(String name)
at FileToAzureTransfer.AzureFileTransferMain.GetFileData

获取Blob数据的原始代码

private static async Task<byte[]> GetFileData(int fileSystemId)
{
    try
    {
        var sqlQueryToGetFile = $@"SELECT [FileData]
                     FROM [dbo].[FileSystem] WHERE [FileSystemId] = @FileId";

        using (var newConnection = new SqlConnection(FileShareConnectionString))
        {
            using (var newCommand = new SqlCommand(sqlQueryToGetFile, newConnection))
            {
                newCommand.CommandType = System.Data.CommandType.Text;
                newCommand.Parameters.AddWithValue("@FileId", fileSystemId);

                await newConnection.OpenAsync().ConfigureAwait(false);

                using (var reader = await newCommand.ExecuteReaderAsync(CommandBehavior.SequentialAccess))
                {
                    while (await reader.ReadAsync())
                    {
                        return (byte[])reader["FileData"];
                    }
                }
            }
        }

        return new byte[0];
    }
    catch(Exception ex)
    {
        using (StreamWriter writer = new StreamWriter($"Error_GetFileData_{filePathPostText}.txt", true))
        {
            await writer.WriteLineAsync($"error info: {errorInfo}");
            await writer.WriteLineAsync(" --- ");
            await writer.WriteLineAsync($"error: {ex.ToString()}");
            await writer.WriteLineAsync(" --- ");
            await writer.WriteLineAsync($"sbInfo: ");
            await writer.WriteLineAsync(sbInfo.ToString());
            await writer.WriteLineAsync(" ------------------------------------------------------ ");
        }

        return null;
    }
}

一、解决System.OutOfMemoryException异常

  1. 优化Blob分块读取逻辑
    当前代码直接将大Blob数据转为byte[]一次性加载到内存,即使64位环境也可能因数据量过大触发内存异常。利用CommandBehavior.SequentialAccess特性分块读取:
private static async Task<byte[]> GetFileData(int fileSystemId)
{
    try
    {
        var sqlQueryToGetFile = @"SELECT [FileData] FROM [dbo].[FileSystem] WHERE [FileSystemId] = @FileId";

        using (var newConnection = new SqlConnection(FileShareConnectionString))
        {
            await newConnection.OpenAsync().ConfigureAwait(false);
            using (var newCommand = new SqlCommand(sqlQueryToGetFile, newConnection))
            {
                newCommand.Parameters.AddWithValue("@FileId", fileSystemId);
                using (var reader = await newCommand.ExecuteReaderAsync(CommandBehavior.SequentialAccess))
                {
                    if (await reader.ReadAsync())
                    {
                        const int bufferSize = 4096;
                        byte[] buffer = new byte[bufferSize];
                        long bytesRead;
                        long offset = 0;

                        using (MemoryStream ms = new MemoryStream())
                        {
                            while ((bytesRead = await reader.GetBytesAsync(0, offset, buffer, 0, bufferSize)) > 0)
                            {
                                ms.Write(buffer, 0, (int)bytesRead);
                                offset += bytesRead;
                            }
                            return ms.ToArray();
                        }
                    }
                }
            }
        }

        return Array.Empty<byte>();
    }
    catch(Exception ex)
    {
        using (StreamWriter writer = new StreamWriter($"Error_GetFileData_{filePathPostText}.txt", true))
        {
            await writer.WriteLineAsync($"error info: {errorInfo}");
            await writer.WriteLineAsync(" --- ");
            await writer.WriteLineAsync($"error: {ex.ToString()}");
            await writer.WriteLineAsync(" --- ");
            await writer.WriteLineAsync($"sbInfo: ");
            await writer.WriteLineAsync(sbInfo.ToString());
            await writer.WriteLineAsync(" ------------------------------------------------------ ");
        }

        return null;
    }
}
  1. 确认64位运行环境配置
  • 右键项目 → 属性 → 生成 → 平台目标选择x64;
  • 发布时进入发布配置,确保平台设置为x64,避免发布过程中平台目标被覆盖。

二、解决「Fatal Error: Failed to Load JIT Compiler」错误

  1. 检查.NET Core 6.x 64位运行时
    在目标机器执行命令dotnet --info,确认已安装对应版本的64位.NET Core运行时,若缺失则下载安装官方对应版本。

  2. 切换为独立部署模式
    发布时选择「独立部署」,将.NET Core运行时与程序打包在一起,避免依赖目标机器的环境:

  • 右键项目 → 发布 → 修改配置 → 部署模式选择「独立」;
  • 目标运行时选择「win-x64」。
  1. 清理重建项目
    删除项目根目录下的bin和obj文件夹,重新生成并发布,消除残留的32位编译文件干扰。

  2. 验证运行权限
    确保运行.exe的用户拥有足够系统权限,避免因权限不足导致JIT编译器组件无法加载。

内容的提问来源于stack exchange,提问作者user272727

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:15:28