.NET Core跨平台直连SAP RFC:无需GUI与NCo的轻量级实现
简介本资源是面向.NET Core开发者的一站式SAP RFC接口调用开发套件专为需在Windows与Linux平台对接SAP后端系统的中高级开发人员设计解决.NET Core项目中无法原生调用SAP RFC函数的核心集成难题。压缩包共56个文件包含6个跨平台动态链接库dll/so/lib、11个C/C头文件h与源码c/cpp用于底层适配理解、6个配置与说明文本txt/ini、2个RFC命令行工具rfcexec/startrfc及数字签名文件smf整体32.34MB结构完整覆盖SDK部署、引用、验证全流程。已有1681人学习下载读者可直接获取SAP NetWeaver RFC Library 7.50官方SDK双平台二进制组件、配套符号文件pdb与签名验证机制结合SapNwRfc开源库使用指南快速搭建稳定、合规的RFC通信环境并深入理解NW RFC SDK的目录组织逻辑与跨平台兼容要点。1. 一个 .NET Core 项目不装 SAP GUI、不配 SAP Logon也能直连 ECC/ S/4HANA 读写 RFC —— 这不是玄学是 RFCLibrary7.5 真实跑通的日常某公司产线 MES 系统要实时拉取 SAP 中的物料主数据变更记录原方案依赖 Windows 服务 SAP GUI 安装 RFC Destination 配置部署到 Linux 容器时直接卡死。后来换上这个 RFCLibrary7.5一行SapRfcDestination.Create()就连上了 S/4HANA 的BAPI_MATERIAL_GETLISTLinux 上用dotnet run启动后3 秒内返回 287 条物料编码 —— 没有 SAP GUI没有sapnwrfc.dll注册甚至没碰过 SAP Logon 工具。它本质是一个轻量级、跨平台、纯托管部分 native的 .NET Core SAP RFC 封装库核心能力是把 SAP NetWeaver RFC SDK 7.5 的 C 接口用 P/Invoke 安全句柄 异步封装稳稳托在 .NET Core 3.1 和 .NET 6/7/8 上。适合做 SAP 对接中台、微服务化 RFC 调用、CI/CD 自动化测试、以及任何不想被 Windows 绑死又必须走标准 RFC 协议的场景。如果你正被“SAP 只能 Windows 跑”“RFC 必须装客户端”这类认知困住这份资源就是你该立刻下载并跑起来的破局点。2. 技术栈与架构定位为什么是 RFCLibrary7.5而不是 SAP NCo 或自研 P/Invoke2.1 官方 SDK 与 .NET 生态的断层现实SAP 官方提供的 SAP NCoNetWeaver Connector虽支持 .NET Core但其最新版NCo 3.0.22仍强制依赖 Windows 平台的sapnco.dllLinux/macOS 下需手动编译sapnco.so且文档极简、异常堆栈模糊、异步支持弱。而 RFCLibrary7.5 不是 NCo 的包装它是直接对接 SAP NetWeaver RFC SDK 7.5 C API 层的独立实现。SDK 7.5 是 SAP 官方发布的跨平台 C SDK含libsapnwrfc.so/sapnwrfc.dll支持 Windows x64、Linux x64glibc ≥ 2.17、Linux ARM64需自行编译RFCLibrary7.5 就是它的 .NET 原生桥接器。它不依赖 NCo也不要求安装 SAP GUI 或 SAP Logon只要系统里有对应平台的sapnwrfc动态库就能工作。2.2 RFCLibrary7.5 的三层架构拆解整个库分三块Native Interop 层SapRfcNative.cs中定义全部DllImport如RfcOpenConnection,RfcGetFunctionDesc,RfcInvoke所有函数签名严格对齐 SDK 7.5 头文件sapnwrfc.h参数传递采用IntPtrMarshal.AllocHGlobal手动内存管理避免 GC 移动导致 SAP 内部指针失效Handle 封装层SapRfcHandle.cs实现SafeHandle子类如SafeRfcConnectionHandle确保连接/函数/表结构等资源在Dispose()或 GC 回收时自动调用RfcCloseConnection等释放函数杜绝句柄泄漏业务抽象层SapRfcDestination.cs提供Create()工厂方法SapRfcFunction.cs封装RfcGetFunctionDesc→RfcCreateFunction→RfcInvoke全链路SapRfcTable.cs和SapRfcStructure.cs用泛型TSpanbyte解析 RFC 表/结构体字段支持string,int,DateTime,decimal,bool等基础类型自动映射也支持自定义结构体反射绑定。提示它不是 ORM不生成实体类它也不是低代码平台不提供可视化配置界面。它是一套“RFC 协议的 .NET 语言级翻译器”目标是让开发者用 C# 写出和 C SDK 示例代码同等可控、同等性能的 RFC 调用逻辑。2.3 与主流替代方案对比真实踩坑后总结方案跨平台支持异步支持类型安全错误诊断学习成本RFCLibrary7.5本文✅ Windows/Linux x64/ARM64✅InvokeAsync()Task.Run(() RfcInvoke())✅ 泛型表/结构体解析字段名强校验✅RfcGetErrorInfo()封装为SapRfcException含code,key,message三元组⚠️ 中需懂 RFC 基本概念如 DEST, FUNCNAME, TABLESSAP NCo 3.0.22❌ Linux 需手动编译 so无 ARM64 官方包⚠️BeginInvoke/EndInvoke已过时无async/await⚠️IRfcFunction.SetValue()用字符串键运行时错❌ 异常信息常为RFC_ERROR_SYSTEM_FAILURE无具体 SAP 错误码⚠️ 低API 简单自研 P/Invoke✅ 可控✅ 可自定义❌ 易因 Marshal 错误导致崩溃⚠️ 需自己解析RFC_ERROR_INFO结构体❌ 高内存管理、字符编码、结构体对齐全是坑结论当你的项目需要稳定跨平台 清晰错误溯源 可控性能 无需 SAP GUI 依赖时RFCLibrary7.5 是目前社区最成熟的折中选择。它不追求“零配置”但把 RFC 最容易翻车的底层细节内存、编码、句柄全兜住了。3. 目录结构与核心文件解析从 src/RfcLibrary 到 bin/Debug/net6.03.1 项目根目录结构精简后的真实布局RFCLibrary7.5/ ├── src/ │ ├── RfcLibrary/ # 主库项目.NET Standard 2.1 │ │ ├── SapRfcNative.cs # 全部 DllImport 声明 │ │ ├── SapRfcHandle.cs # SafeHandle 封装Connection/Function/Table │ │ ├── SapRfcDestination.cs # 连接工厂、配置加载、连接池可选 │ │ ├── SapRfcFunction.cs # 函数调用主流程获取描述 → 创建实例 → 设置参数 → 执行 → 解析结果 │ │ ├── SapRfcTable.cs # RFC Table 解析支持 GetRow(), GetColumn(), ToListT() │ │ └── SapRfcStructure.cs # RFC Structure 解析支持 GetValueT(FIELD_NAME) │ └── RfcLibrary.Tests/ # xUnit 测试含 Mock Native Call ├── lib/ │ ├── win-x64/sapnwrfc.dll # SDK 7.5 Windows x64 动态库 │ ├── linux-x64/libsapnwrfc.so # SDK 7.5 Linux x64 动态库glibc 2.17 │ └── linux-arm64/libsapnwrfc.so # SDK 7.5 Linux ARM64需自行从 SAP 支持包提取 ├── samples/ │ └── ConsoleApp/ # 控制台示例调用 BAPI_USER_GET_DETAIL └── build/ └── build.ps1 # PowerShell 构建脚本含 native lib 拷贝逻辑注意lib/目录下的.dll/.so不是源码编译而来是 SAP 官方发布的二进制 SDK。你必须从 SAP Support Portal 下载SAP NW RFC SDK 7.5文件名类似nwrfcsdk750P_5-70003095.zip解压后将lib/下对应平台的动态库复制到本项目的lib/子目录。这是合法合规的使用方式也是唯一能保证 ABI 兼容性的做法。3.2SapRfcNative.cs关键 P/Invoke 声明解析internal static class SapRfcNative { private const string LibraryName RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? sapnwrfc.dll : RuntimeInformation.IsOSPlatform(OSPlatform.Linux) ? sapnwrfc : throw new PlatformNotSupportedException(Unsupported OS); [DllImport(LibraryName, CallingConvention CallingConvention.Cdecl, EntryPoint RfcOpenConnection)] internal static extern IntPtr RfcOpenConnection(IntPtr config, out IntPtr errorInfo); [DllImport(LibraryName, CallingConvention CallingConvention.Cdecl, EntryPoint RfcGetFunctionDesc)] internal static extern IntPtr RfcGetFunctionDesc(IntPtr connHandle, string functionName, out IntPtr errorInfo); [DllImport(LibraryName, CallingConvention CallingConvention.Cdecl, EntryPoint RfcCreateFunction)] internal static extern IntPtr RfcCreateFunction(IntPtr funcDescHandle, out IntPtr errorInfo); [DllImport(LibraryName, CallingConvention CallingConvention.Cdecl, EntryPoint RfcInvoke)] internal static extern RFC_RC RfcInvoke(IntPtr connHandle, IntPtr funcHandle, out IntPtr errorInfo); }LibraryName动态判断Windows 用sapnwrfc.dll带扩展名Linux 用sapnwrfcdlopen 默认加.soCallingConvention.CdeclSAP SDK 是 C 接口必须用 Cdecl否则栈平衡错乱程序崩溃IntPtr返回值所有 SAP Handle 都是void*C# 用IntPtr接收后续传给其他RfcXXX函数out IntPtr errorInfo每个函数都提供错误输出指向RFC_ERROR_INFO结构体后续由SapRfcException.FromErrorInfo()解析RFC_RC是枚举RFC_OK 0,RFC_COMMUNICATION_FAILURE 1,RFC_LOGON_FAILURE 2等是判断调用成败的第一依据。3.3SapRfcDestination.Create()的完整配置链var config new Dictionarystring, string { [ashost] 10.1.2.3, // SAP 应用服务器 IP [sysnr] 00, // 系统编号两位数字字符串 [client] 800, // 客户端号 [user] RFC_USER, // 授权用户需有 S_RFC 权限 [passwd] SecurePass123, // 密码明文生产环境建议用 SecureString 或密钥管理 [lang] ZH, // 登录语言 [trace] 3 // 3详细跟踪日志写入 saprfc.trc调试用 }; var destination SapRfcDestination.Create(config);所有键名ashost,sysnr必须小写SAP SDK 对大小写敏感passwd明文是 SDK 限制无法绕过生产环境务必配合操作系统级凭据管理如 Linuxkeyring或 Windows DPAPItrace3会生成saprfc.trc文件位置在当前工作目录是排查连接超时、认证失败的首要依据SapRfcDestination内部会调用RfcOpenConnection若失败则抛出SapRfcExceptionexception.Code即RFC_LOGON_FAILURE等码exception.Message包含 SAP 返回的完整错误文本如User RFC_USER is not authorized。4. 快速跑通从新建项目到调用 BAPI_USER_GET_DETAIL含完整可执行代码4.1 环境准备三步到位Step 1确认 .NET SDK 版本dotnet --list-sdks # 必须 ≥ 3.1推荐 .NET 6 LTS 或 .NET 8Step 2下载并放置 SAP SDK 7.5 动态库访问 SAP Support Portal → 搜索 “NW RFC SDK 7.5” → 下载nwrfcsdk750P_5-70003095.zip解压后Windows 用户取nwrfcsdk/lib/sapnwrfc.dll复制到你项目的lib/win-x64/Linux 用户取nwrfcsdk/lib/libsapnwrfc.so复制到lib/linux-x64/验证Linux 下运行ldd libsapnwrfc.so | grep not found确保无缺失依赖如libstdc.so.6,libgcc_s.so.1。Step 3创建新项目并引用库# 新建控制台项目 dotnet new console -n SapRfcDemo cd SapRfcDemo # 添加 RFCLibrary7.5 项目引用假设你已解压源码到 ../RFCLibrary7.5 dotnet add reference ../RFCLibrary7.5/src/RfcLibrary/RfcLibrary.csproj # 若用 NuGet 包如有则 # dotnet add package RFCLibrary7.5 --version 1.0.04.2 核心调用代码获取用户详情BAPI_USER_GET_DETAILusing RfcLibrary; class Program { static async Task Main(string[] args) { // 1. 构建连接配置请替换为你的 SAP 环境 var config new Dictionarystring, string { [ashost] 10.1.2.3, [sysnr] 00, [client] 800, [user] RFC_USER, [passwd] YourPassword, [lang] EN }; try { // 2. 创建连接同步阻塞直到连接建立或失败 using var dest SapRfcDestination.Create(config); // 3. 获取函数描述并创建函数实例 using var func dest.CreateFunction(BAPI_USER_GET_DETAIL); // 4. 设置输入参数USERNAME 是必填的 IMPORT 参数 func.SetValue(USERNAME, BCUSER); // SAP 标准测试用户 // 5. 执行调用同步 await func.InvokeAsync(); // 内部用 Task.Run 包装 RfcInvoke避免阻塞线程池 // 6. 解析输出参数TABLES 和 EXPORTS var address func.GetStructure(ADDRESS); // STRUCTURE 类型 Console.WriteLine($Name: {address.GetValuestring(FULLNAME)}); Console.WriteLine($Email: {address.GetValuestring(E_MAIL)}); var returnTable func.GetTable(RETURN); // TABLE 类型 foreach (var row in returnTable.Rows) { var type row.GetValuestring(TYPE); // S成功, E错误, W警告 var message row.GetValuestring(MESSAGE); Console.WriteLine($[{type}] {message}); } } catch (SapRfcException ex) { // 7. SAP 层错误如权限不足、函数不存在 Console.WriteLine($SAP Error {ex.Code} ({ex.Key}): {ex.Message}); } catch (Exception ex) { // 8. .NET 层错误如网络超时、DLL 加载失败 Console.WriteLine($Runtime Error: {ex.GetType().Name} - {ex.Message}); } } }func.GetStructure(ADDRESS)返回SapRfcStructure实例GetValueT()通过字段名反射获取值类型由 SAP 字典定义returnTable.RowsSapRfcTable的Rows是IReadOnlyListSapRfcStructure每行即一个RETURN表记录InvokeAsync()内部是Task.Run(() RfcInvoke(...))不是真正的异步 I/O但能避免 UI 线程或 ASP.NET Core 请求线程被长时间阻塞using语句确保SapRfcFunction和SapRfcDestination的Dispose()被调用自动关闭连接、释放函数句柄。4.3 运行与验证看到这三行就算成功执行dotnet run预期输出Name: Early User Email: early.userexample.com [S] User data read successfully若看到[E] User BCUSER does not exist说明用户名错了若看到SapRfcException: RFC_LOGON_FAILURE检查user/passwd/client若报DllNotFoundException: sapnwrfc说明lib/下动态库路径或名称不对。提示第一次运行时SAP 服务器可能因安全策略拒绝新 IP 的 RFC 连接需联系 BASIS 管理员在SM59中检查 Destination 状态或临时开启rdisp/mshost相关参数仅调试。5. 避坑指南五个血泪经验换来的常见问题与排查路径5.1 现象DllNotFoundException: sapnwrfcLinux原因libsapnwrfc.so缺少运行时依赖或LD_LIBRARY_PATH未包含其所在目录。解决运行ldd libsapnwrfc.so检查not found的库常见libstdc.so.6,libgcc_s.so.1安装缺失包sudo apt-get install libstdc6 libgcc1Ubuntu或sudo yum install libstdc libgccCentOS启动前设置export LD_LIBRARY_PATH/path/to/your/project/lib/linux-x64:$LD_LIBRARY_PATH更可靠做法在.csproj中添加CopyToOutputDirectoryPreserveNewest/CopyToOutputDirectory到libsapnwrfc.so并确保发布后它在publish/目录下。5.2 现象SapRfcException: RFC_COMMUNICATION_FAILUREMessage为空原因网络层不通防火墙、路由或ashost/sysnr配置错误导致连接被 SAP 服务器静默拒绝。解决先用telnet 10.1.2.3 3300sysnr00对应端口3300测试 TCP 连通性开启 trace在 config 中加[trace] 3运行后检查生成的saprfc.trc搜索ERROR或COMMUNICATION确认sysnr是两位字符串00不是0或0SAP 服务器端口 3300 sysnr00→3300,01→3301。5.3 现象SapRfcException: RFC_INVALID_PARAMETERMessage提示FIELD_NAME not found原因SetValue()或GetValue()使用的字段名与 SAP 函数实际定义不符大小写、下划线、缩写。解决在 SAP 系统中事务码SE37输入函数名如BAPI_USER_GET_DETAIL点“显示” → “导入/导出参数” → “表” → 查看ADDRESS结构体的字段名如FULLNAME不是fullName或full_nameRFCLibrary7.5 字段名严格区分大小写且必须与 SAP 字典完全一致用func.GetStructure(ADDRESS).GetFieldNames()动态获取可用字段名列表调试时打印出来比对。5.4 现象Linux 下RfcOpenConnection返回IntPtr.Zero但errorInfo为null原因libsapnwrfc.so与当前 glibc 版本不兼容SDK 7.5 要求 glibc ≥ 2.17。解决运行ldd --version确认 glibc 版本若低于 2.17如 CentOS 6 的 2.12必须升级系统或换用容器如ubuntu:20.04不要尝试用patchelf修改libsapnwrfc.so的 glibc 依赖会导致运行时崩溃。5.5 现象调用成功但GetTable(RETURN).Rows.Count 0无任何错误提示原因函数执行成功但RETURN表未被 SAP 填充某些 BAPI 设计如此或你调用的是无返回值的RFC_FUNCTION非 BAPI。解决查阅 SAP 函数文档SE37→ “帮助” → “函数模块文档”确认该函数是否真有RETURN表检查func.GetTableNames()输出看是否有RETURN若无RETURN改用func.GetExportParameterNames()查看EXPORT参数如BAPI_USER_GET_DETAIL的ADDRESS就是EXPORT类型不是TABLES。6. 二次开发实战如何安全地封装 BAPI 调用为领域服务并注入 ASP.NET Core DI6.1 定义领域接口与 DTO隔离 SAP 细节// Domain/Models/UserProfile.cs public record UserProfile( string FullName, string Email, string PhoneNumber, DateTime CreatedAt); // Domain/Services/IUserService.cs public interface IUserService { TaskUserProfile? GetUserProfileAsync(string username, CancellationToken ct default); } // Domain/Exceptions/SapUnavailableException.cs public class SapUnavailableException : Exception { public SapUnavailableException(string message, Exception inner) : base(message, inner) { } }提示绝不把SapRfcFunction或SapRfcStructure暴露到领域层。DTO 必须是纯 C# 类字段名用 PascalCase与 SAP 字段名解耦。6.2 实现服务封装错误重试、超时、降级逻辑// Infrastructure/Sap/SapUserService.cs public class SapUserService : IUserService { private readonly ILoggerSapUserService _logger; private readonly IConfiguration _config; public SapUserService(ILoggerSapUserService logger, IConfiguration config) { _logger logger; _config config; } public async TaskUserProfile? GetUserProfileAsync(string username, CancellationToken ct default) { var configDict _config.GetSection(SapRfc).GetDictionarystring, string() ?? throw new InvalidOperationException(SapRfc config missing); // 1. 重试策略最多 3 次指数退避 var retryPolicy Policy .HandleSapRfcException(ex ex.Code is RFC_RC.RFC_COMMUNICATION_FAILURE or RFC_RC.RFC_LOGON_FAILURE) .WaitAndRetryAsync( retryCount: 3, sleepDurationProvider: retryAttempt TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), onRetry: (outcome, timespan, retryCount, context) _logger.LogWarning(outcome.Exception, SAP call failed, retry {RetryCount} in {Timespan}, retryCount, timespan)); try { return await retryPolicy.ExecuteAsync(async ct { using var dest SapRfcDestination.Create(configDict); using var func dest.CreateFunction(BAPI_USER_GET_DETAIL); func.SetValue(USERNAME, username); // 2. 超时10 秒内必须返回否则取消 using var cts CancellationTokenSource.CreateLinkedTokenSource(ct); cts.CancelAfter(TimeSpan.FromSeconds(10)); await func.InvokeAsync(cts.Token); // 3. 解析并映射到 DTO var address func.GetStructure(ADDRESS); var retTable func.GetTable(RETURN); // 4. 检查 RETURN 表是否有错误 if (retTable.Rows.Any(r r.GetValuestring(TYPE) E)) { var errorMsg retTable.Rows.First(r r.GetValuestring(TYPE) E) .GetValuestring(MESSAGE); throw new InvalidOperationException($SAP error: {errorMsg}); } return new UserProfile( address.GetValuestring(FULLNAME), address.GetValuestring(E_MAIL), address.GetValuestring(TEL_NUMBER), DateTime.Now); // 实际应从 SAP 字段取 }, ct); } catch (OperationCanceledException) when (ct.IsCancellationRequested) { throw; // 用户主动取消 } catch (Exception ex) when (ex is SapRfcException or InvalidOperationException) { _logger.LogError(ex, SAP user profile fetch failed for {Username}, username); throw new SapUnavailableException(Failed to fetch user profile from SAP, ex); } } }Policy来自Polly库专治 RFC 网络抖动cts.CancelAfter(10)确保单次调用不卡死InvokeAsync内部会响应CancellationTokenretTable.Rows检查是必须步骤BAPI 成功不代表业务成功RETURN表里的E才是真错误所有 SAP 异常最终转为领域异常SapUnavailableException上层 Controller 可统一处理如返回 503 Service Unavailable。6.3 注入 DI 容器生命周期与连接池考量// Program.cs (.NET 6) var builder WebApplication.CreateBuilder(args); // 1. 注册 IUserServiceScoped每次 HTTP 请求新建实例 builder.Services.AddScopedIUserService, SapUserService(); // 2. 可选注册连接池管理器Singleton // builder.Services.AddSingletonISapRfcConnectionPool, SapRfcConnectionPool(); var app builder.Build(); app.MapGet(/user/{username}, async (string username, IUserService service) { try { var profile await service.GetUserProfileAsync(username); return profile is null ? Results.NotFound() : Results.Ok(profile); } catch (SapUnavailableException ex) { return Results.StatusCode(503); // 降级响应 } }); app.Run();Scoped生命周期足够因为SapRfcDestination.Create()本身是轻量级的只建连接不维护长连接池若高并发QPS 100可自行实现连接池缓存SafeRfcConnectionHandle用ConcurrentQueue管理空闲连接RfcOpenConnection/RfcCloseConnection成对调用切勿注册SapRfcDestination为 SingletonSAP 连接不是线程安全的多线程共用同一连接句柄会导致RFC_INVALID_HANDLE。从那以后我每次封装 SAP RFC 调用都强制走一遍「SE37 查字段 → 写 DTO → 写重试/超时 → 写 RETURN 表校验」四步 checklist再提交代码。漏掉任何一步上线后凌晨三点的告警邮件就会准时抵达——这已经不是玄学是刻进肌肉的记忆。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

后端集成与验证实践:从接口联调到幂等设计的高频面试精讲

后端集成与验证实践:从接口联调到幂等设计的高频面试精讲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 2:00:53 阅读更多 →
动漫网站设计与实现:基于JSP与Oracle的B/S架构方案

动漫网站设计与实现:基于JSP与Oracle的B/S架构方案

简介:这是一篇关于动漫网站设计与实现的完整毕业论文,面向计算机、软件工程等专业学生,可作为毕业设计写作与系统开发的参考范本。论文以动漫主题内容平台为研究对象,完整覆盖了网站建设的核心流程:从项目背景和需求分…

2026/10/18 2:00:53 阅读更多 →
InstaLOD Pipeline 2019自动LOD减面与批量生产完整指南

InstaLOD Pipeline 2019自动LOD减面与批量生产完整指南

简介:面向Windows平台3D内容创作者与游戏开发者的InstaLOD Pipeline 2019插件包,重点解决大规模场景渲染卡顿、加载缓慢及资源占用过高的难题。这套基于即时细节层次(LOD)技术的工具,可根据相机距离与视角实时调整模型…

2026/10/18 2:00:53 阅读更多 →

最新新闻

抛弃 OpenClawd 吧!我用 Go 打造了企业级 Swarm(蜂群)agent,更智能,更安全、性能快 5 倍、成本直降 80%:TaoToken 统一 Key 接入实战

抛弃 OpenClawd 吧!我用 Go 打造了企业级 Swarm(蜂群)agent,更智能,更安全、性能快 5 倍、成本直降 80%:TaoToken 统一 Key 接入实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 2:46:03 阅读更多 →
从URL解析到报文发送:HTTP客户端请求的完整链路解析

从URL解析到报文发送:HTTP客户端请求的完整链路解析

1. 发送请求之前:客户端到底做了什么准备在地址栏敲下一个网址,按下回车到页面出现,中间隔着几百毫秒。这短短一瞬间,客户端要完成的工作远比大多数人想象得多。HTTP协议客户端向服务器发送请求,真正起始的地方不是&qu…

2026/10/18 2:46:03 阅读更多 →
VLLM+Deepseek+Milvus构建私有知识库RAG问答系统实战详解

VLLM+Deepseek+Milvus构建私有知识库RAG问答系统实战详解

先交代一下背景:最近我把本地知识库的整套链路重新搭了一遍,最终选定的组合是VLLM Deepseek Milvus。之前也折腾过好几个方案,最头疼的是推理性能和检索召回总是顾此失彼,要么模型跑得慢,要么向量查不准。这一版跑顺…

2026/10/18 2:46:03 阅读更多 →
6脉冲与12脉冲晶闸管HVDC仿真:从拓扑差异到控制策略

6脉冲与12脉冲晶闸管HVDC仿真:从拓扑差异到控制策略

看到“高压柔性输电系统6脉冲、12脉冲晶闸管控制HVDC仿真模型”这个标题,第一反应不是急着打开仿真软件,而是先想掰扯清楚“柔性”这两个字。现在的行业语境里,一提柔性输电,多数人想到的是模块化多电平换流器MMC、电压源换流器VS…

2026/10/18 2:46:03 阅读更多 →
计数排序、桶排序、基数排序:三种O(n)线性排序算法详解

计数排序、桶排序、基数排序:三种O(n)线性排序算法详解

如果只学到快排、归并和堆排,你大概率会觉得 O(n log n) 已经是排序算法的天花板了。毕竟算法课上讲过:基于比较的排序,最优下界就是 O(n log n)。但真到业务里,你会碰到一批时间复杂度 O(n) 的排序算法,比如计数排序、…

2026/10/18 2:46:03 阅读更多 →
算法刷题Day1:从哈希表到双指针,建立高效解题思维框架

算法刷题Day1:从哈希表到双指针,建立高效解题思维框架

我最早关注到“灵神”这个名字,是因为一道排序题的解法和官方题解完全不同,边看边拍大腿:原来算法还能这么拆。后来我养成了一个习惯,每天花四十分钟跟着灵神系列刷题,两个月下来,从“看题发呆”变成“看到…

2026/10/18 2:45:03 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →