CLI,MCP,API,COM,DLL的异同点和它们各自的工作原理和机制

张开发
2026/4/6 20:04:04 15 分钟阅读

分享文章

CLI,MCP,API,COM,DLL的异同点和它们各自的工作原理和机制
几个技术概念的异同点和原理机制CLI、MCP、API、COM、DLL。这个问题有一定深度需要清晰区分它们所属的层次和核心用途。这些术语来自不同领域。CLI是命令行接口属于用户交互层。DLL是动态链接库属于代码组织和复用层。API是接口规范的概念。COM是微软的组件对象模型是一种二进制级别的组件标准。MCP是Model Context Protocol最近AI领域提到的用于AI与工具/数据交互的协议。需要厘清每个概念的核心定位。CLI进程启动标准输入输出流用户键入命令。DLLWindows下的共享库运行时动态加载导出函数。API一套定义好的调用约定可以是任何形式函数、HTTP端点。COM定义接口、类厂、引用计数、QueryInterface等机制实现二进制兼容和语言无关。MCP客户端-服务器协议通常基于JSON-RPC用于AI模型与外部上下文/工具通信。异同点它们都是“接口”或“协议”的某种形式但抽象层次、目标、使用场景差异很大。CLI和MCP侧重进程间或人机交互API是通用概念COM和DLL是具体技术实现。相同点在于解耦、标准化。不同点需要从通信方向、数据格式、调用方式、耦合度、平台依赖性等方面对比。工作原理机制CLI解释执行命令通过stdin/stdout。DLL在进程地址空间加载重定位调用函数。API规范调用约定和数据结构。COM通过虚函数表vtable和GUID标识接口客户端通过CoCreateInstance创建对象。MCP建立会话AI发送请求服务器返回结构化数据或执行动作。这是一个很有深度的技术问题。这五个概念CLI、MCP、API、COM、DLL分别属于交互模式、通信协议、接口规范、组件模型、代码复用等不同层次。为了清晰对比我先分别解析再集中比较。1. 各自的工作原理与机制1.1 CLI (Command-Line Interface命令行接口)本质人机交互的文本界面。原理用户输入一行文本命令参数Shell如bash、cmd.exe解析后执行内部命令或查找、加载外部程序如git传入参数程序运行后将结果打印到标准输出stdout用户看到输出。机制同步、行缓冲、基于标准输入输出流stdin/stdout/stderr。1.2 API (Application Programming Interface应用程序编程接口)本质代码调用的契约与规范。原理定义好函数名、参数类型、返回值、调用方式等。开发者只需遵循契约调用无需关心内部实现。机制通常通过函数调用压栈、跳转、返回或远程调用HTTP RPC、gRPC实现。它是抽象概念具体形式可以是C函数库、Web接口等。1.3 DLL (Dynamic-Link Library动态链接库)本质Windows下的共享代码库二进制文件扩展名.dll。原理程序运行时操作系统加载器将DLL映射到进程地址空间。程序通过导入表找到DLL中函数地址加载时或运行时通过LoadLibraryGetProcAddress然后直接调用。机制地址重定位PIC或加载时修正、导出符号表。多个进程可共享同一DLL的代码段只读节省内存。1.4 COM (Component Object Model组件对象模型)本质二进制级别的组件标准跨语言、跨进程、跨版本。原理每个COM组件实现一个或多个接口纯虚函数表vtable。客户通过**全局唯一标识符CLSID/GUID**请求创建组件。COM库负责定位、加载可能从DLL或EXE并返回接口指针。调用时直接通过vtable跳转。机制引用计数AddRef/Release、QueryInterface动态获取接口、列集/散集跨进程时参数封送、注册表存储组件位置。DLL是COM组件的常见载体。1.5 MCP (Model Context Protocol模型上下文协议)本质AI应用与外部数据/工具间的标准化协议2024年由Anthropic提出。原理采用JSON-RPCover stdio/SSE/WebSocket。定义了三类原语ResourcesAI读取数据如文件、DB记录、ToolsAI执行动作如发邮件、调API、Prompts预定义对话模板。AI通过MCP客户端与MCP服务器通信。机制客户端如Claude Desktop启动MCP服务器子进程或连接远程。AI模型决定调用某个Tool客户端生成JSON-RPC请求发送给服务器服务器执行后返回结果。2. 异同点对比维度CLIAPIDLLCOMMCP核心目的人与程序交互程序与程序调用代码复用、动态加载跨语言二进制组件AI获取外部上下文/动作抽象层级用户界面层接口规范层代码/二进制复用层组件对象层协议/应用层调用方人打字代码函数调用可执行文件COM客户端任何语言AI模型通过客户端被调方程序进程库/服务/OS同一进程的DLLCOM组件DLL/EXEMCP服务器通常独立进程通信方式标准输入输出函数调用栈 / RPC直接内存跳转同进程同进程vtable跨进程RPCJSON-RPC over stdio/WebSocket语言依赖性无关文本流取决于API设计如C ABIC ABI或C mangling二进制标准vtable语言无关完全语言无关JSON状态管理无状态每条命令独立通常无状态函数无记忆有状态全局变量随进程有状态组件实例有状态会话、资源连接典型例子ls -l,git commitWindows Win32 APIkernel32.dllIShellFolder接口Claude Desktop 文件系统MCP服务器进程边界跨进程Shell子进程同进程除RPC API同进程可同进程DLL COM或跨进程EXE COM通常跨进程AI客户端 vs MCP服务器3. 深入精确解析关键区别CLI vs APICLI面向人不稳定人可能打错字API面向程序精确可靠。CLI适合一次性任务API适合程序化集成。但可通过封装库互相转化如libgit2vsgitCLI。DLL vs APIDLL是API的一种物理载体。一个DLL暴露出一组API函数导出表。但API不一定来自DLL可以是静态库.lib或Web API。COM vs DLLDLL只解决代码复用有严重限制编译器依赖不同VC版本可能不兼容、语言绑定难C DLL在VB中调用困难。COM在DLL基础上增加二进制标准vtable布局固定、位置透明性可本地或远程、版本管理通过接口ID。可以说COM用DLL作为组件服务器但附加了标准协议。COM vs APIAPI通常静态绑定编译时确定函数名和参数COM动态发现运行时QueryInterface看组件是否支持某接口。API难以跨进程需手写封送代码COM内置跨进程能力。MCP vs APIMCP是专门面向LLM的API。传统API需要为每个功能写不同代码如调用get_weather函数而MCP让AI通过统一协议动态发现Tool并调用。API返回给程序的是结构化数据MCP返回给AI的是自然语言数据混合体AI可理解。MCP vs COMCOM设计于1990年代解决二进制组件重用MCP设计于2020年代解决AI与外部世界的互操作。COM注重对象生命周期和接口查询MCP注重资源、工具、提示的标准化描述。COM是底层构件模型MCP是高层AI生态协议。4. 关联与协作实例一个典型Windows程序可能同时涉及多个概念你通过CLI命令提示符启动myapp.exemyapp.exe调用Win32 APICreateFile读取文件这个API的实现位于**kernel32.dll**myapp还使用COMCoCreateInstance从ole32.dll加载一个Excel组件对象操作电子表格未来这个myapp可能内置MCP客户端让AI助手如Claude通过MCP协议访问应用内部数据如“当前打开的文档内容”总结表速查概念一句话定义谁调用谁进程边界关键创新CLI人通过文本命令控制程序人 → 程序跨进程标准输入输出流API程序调用另一程序的约定程序 → 程序同进程或跨进程函数契约抽象DLLWindows的动态共享库EXE → DLL同进程运行时加载共享内存COM二进制级组件标准客户端 → 组件可同可跨接口vtableQueryInterfaceMCPAI模型与工具/数据的协议AI → MCP服务器跨进程资源/工具/提示统一描述希望这个精确解析能帮助大家理解这些看似相似实则层次迥异的技术概念。下面列出CLIAPIDLLCOMMCP在不同的操作系统下或不同的编程语言下不同的应用程序下所使用的工具。**注意DLL主要是Windows概念但其他系统有类似物SO、dylib。COM主要Windows但有跨平台变体如XPCOM、FreeCOM但通常COM是Windows。MCP是较新的协议跨平台。API是通用概念。工具指开发、调试、使用这些技术时用到的工具编译器、链接器、IDL编译器、注册工具、客户端库等。将分概念按操作系统Windows, Linux, macOS、编程语言C/C, Python, Java, C#等、应用程序如浏览器、Office、AI应用等列出工具并举例。下面按CLI、API、DLL、COM、MCP五个概念分别从操作系统、编程语言、应用程序三个维度列出常用工具并举例深入解析。1. CLI (命令行接口)本质文本交互界面工具是Shell及其配套命令/脚本环境。维度工具 / 环境举例说明Windowscmd.exe, PowerShell, Windows Terminal, WSL Bashdir /w在cmd中列出文件Get-Process在PowerShell中查看进程Linuxbash, zsh, fish, dash, shls -la | grep txt管道组合awk {print $1}文本处理macOSzsh (默认), bash, Terminal.app, iTerm2plutil -p Info.plist解析macOS专属属性列表C/Csystem() 调用, popen()system(ls -l)在C程序中执行CLI命令Pythonsubprocess模块, os.system, sh库subprocess.run([git, status])调用git CLIJavaRuntime.exec(), ProcessBuilderProcessBuilder pb new ProcessBuilder(ping,8.8.8.8)C#System.Diagnostics.ProcessProcess.Start(dotnet, --version)应用程序几乎一切后台服务、IDE终端、容器CLIVS Code内置终端Docker CLI (docker ps)kubectl深入解析CLI工具的本质是创建子进程并重定向标准输入输出。例如Python的subprocess.Popen会调用OS的forkexecLinux或CreateProcessWindows。Shell本身也是一个CLI工具它解析用户输入并负责进程管理、管道|通过共享匿名管道实现。2. API (应用程序编程接口)API是规范具体“工具”指生成、文档、调用、测试API的辅助工具。不同OS/语言/应用环境下差异巨大。维度工具 / 环境举例说明WindowsWin32 API 文档 (MSDN), Windows SDK (头文件、lib), API Monitor 工具CreateFileAPI需要windows.hAPI Monitor可实时捕获进程调用了哪些Win32 APILinuxman pages, glibc, syscall 表, strace, ltraceman 2 open查看系统调用strace -e open ls追踪程序打开的文件macOSApple Developer Documentation, 框架 (Cocoa, CoreFoundation),otoolSecKeychainAPI 用于钥匙串otool -L app查看链接的API框架C/C头文件、静态库/动态库、Doxygen文档生成、cppreference#include curl/curl.h使用libcurl的APIDoxygen生成API文档Python标准库模块、PyPI包、help() / pydoc, Swig, ctypesrequests.get()是HTTP APIctypes.CDLL调用C APIJavaJavadoc, 接口/抽象类, JNI调用原生API, 反射java.net.HttpURLConnection是Java标准APIJavadoc生成API文档C#.NET API 文档, Visual Studio 对象浏览器, P/InvokeSystem.IO.File.Open.NET API[DllImport]调用Win32 API应用程序API 网关、SDK、REST Client、GraphQL PlaygroundPostman (测试REST API)OpenAPI Generator (生成客户端SDK)深入解析API工具链包括定义IDL如OpenAPI/GraphQL Schema、生成swagger-codegen、调用HTTP客户端库、调试Wireshark抓HTTP包。操作系统层面的API工具如strace直接拦截系统调用内核API而ltrace拦截动态库函数调用。3. DLL (动态链接库)DLL是Windows二进制共享库其他OS有类似物Linux SO, macOS dylib但名称不同。工具用于创建、查看、依赖分析、调试。维度工具 / 环境举例说明WindowsVisual Studio (cl.exe, link.exe), Dependency Walker, Dumpbin, Process Explorer, LoadLibrary/GetProcAddressdumpbin /exports my.dll查看导出函数DependencyWalker分析DLL依赖树Linux(SO)gcc/g, ld, ldd, objdump, nm, readelf, dlopen/dlsymldd /bin/ls列出共享库依赖objdump -T lib.so查看动态符号表macOS(dylib)clang, ld, otool, nm, install_name_tool, dyld APIotool -L app.dylibinstall_name_tool -change修改依赖路径C/C__declspec(dllexport) /attribute((visibility)), CMake的SHARED库Windows:__declspec(dllexport) void func();Linux:-fvisibilityhiddenPythonctypes.CDLL, pybind11, Cythonlib ctypes.CDLL(./mylib.dll)pybind11 将C库打包成Python模块底层仍是DLL/SOJavaJNA (Java Native Access), JNINativeLibrary.getInstance(kernel32)加载DLL并调用C#P/Invoke, DllImport, LoadLibraryEx[DllImport(user32.dll)] static extern int MessageBox(...)应用程序浏览器插件NPAPI已淘汰、游戏Mod、Photoshop插件Chrome的.dll插件PPAPI游戏引擎Unity以DLL加载脚本逻辑深入解析DLL工具的核心任务编译生成位置无关代码或通过重定位表、链接链接器将导入表写入EXE、运行时加载LoadLibrary搜索路径顺序可执行目录→系统目录→PATH、查看dumpbin /imports查看EXE依赖哪些DLL。Linux的ldd实际是一个脚本通过设置LD_TRACE_LOADED_OBJECTS环境变量调用动态链接器。4. COM (组件对象模型)COM是Windows专用二进制标准跨语言组件开发。工具涉及IDL编译、注册、调用、查看。维度工具 / 环境举例说明WindowsMIDL (IDL编译器), regsvr32 (注册DLL COM服务器), OleView / OLE/COM Object Viewer, COMAdmin, Process Monitormidl mycomponent.idl生成代理/存根regsvr32 my.dll注册OleView查看系统所有注册COM组件Linux(非原生)Wine (实现COM), 或跨平台框架如XPCOM (Mozilla)Wine的winecfg管理COM组件XPCOM已废弃曾用于FirefoxmacOS极少原生COM通过Wine或第三方桥接CrossOver Mac 运行Windows COM组件C/CATL (Active Template Library), WRL (Windows Runtime C Template Library), #import 指令CoCreateInstance(CLSID_MyComp, NULL, CLSCTX_INPROC_SERVER, IID_IMyInterface, (void**)ptr)Pythonpywin32 (win32com.client), comtypesimport win32com.client; excel win32com.client.Dispatch(Excel.Application)C#.NET Interop (Tlbimp, Regasm, C#中的COM引用)[ComVisible(true)]导出.NET类为COMtlbimp com.dll生成互操作程序集VB6 / VBScript原生支持COMCreateObjectSet obj CreateObject(Scripting.FileSystemObject)应用程序Office自动化VBA、Windows Shell扩展、IE浏览器插件ActiveX、Windows Media Player在资源管理器中右键菜单“属性”调用COM shell扩展Excel VBA使用COM控制Word深入解析COM工具链分几个阶段1)IDL定义接口→ MIDL生成代理/存根C代码及类型库(.tlb)2)实现DLL并导出DllGetClassObject等四个函数3)注册regsvr32将CLSID写入注册表HKEY_CLASSES_ROOT\CLSID\{...}4)客户端调用CoInitialize→CoCreateInstance根据注册表找到DLL路径并加载→ 通过vtable调用方法。OleView可枚举所有已注册COM类查看其接口、AppID等。5. MCP (Model Context Protocol)MCP是2024年提出的AI模型与外部工具/数据通信的协议通常基于JSON-RPC。工具包括MCP客户端库、服务器SDK、调试工具。跨平台、语言无关。维度工具 / 环境举例说明WindowsMCP CLI客户端如mcp命令行Claude Desktop for WindowsMCP Inspectormcp run server.pyClaude Desktop配置MCP服务器通过claude_desktop_config.jsonLinux同上以及通过stdio运行的任何MCP服务器npx -y modelcontextprotocol/server-filesystem /tmp启动文件系统MCP服务器macOSClaude Desktop for macOS, MCP Inspector GUIbrew install mcp-inspectorClaude Desktop支持SSE传输PythonmcpPyPI包 (SDK), fastmcp, 以及FastAPI/Starlette适配from mcp.server import Server用server.tool()装饰器定义工具stdio_server.run()TypeScript/JSmodelcontextprotocol/sdk(npm),mcp-remoteimport { Server } from modelcontextprotocol/sdk/server/index.js使用StdioServerTransportC#社区实现Mcp.Net(NuGet), 或手写JSON-RPCMcpServer.Create(my-server)通过Console.In/Out进行stdio通信Java社区实现mcplib或Spring AI适配使用ProcessBuilder启动MCP服务器子进程通过InputStream/OutputStream进行JSON-RPC应用程序Claude Desktop, Continue (VS Code扩展), Zed编辑器, 以及自定义AI Agent框架Continue插件配置MCP服务器让AI助手读取本地文件或执行shell命令Zed通过MCP集成外部工具链深入解析MCP的工具链特点客户端如Claude Desktop负责启动MCP服务器子进程或连接远程WebSocket并通过stdio或SSE传输JSON-RPC。开发者用SDKPython/TS快速实现服务器定义Resources/Tools/Prompts。调试工具如MCP Inspector提供图形界面可连接到任意MCP服务器列出所有Tools模拟调用并查看响应。MCP协议中Tools本质是将函数签名名称、参数schema暴露给AI模型模型通过自然语言决定调用哪个Tool客户端转换为JSON-RPC请求。总结跨概念工具速查表概念通用工具Windows特有Linux特有跨语言工具CLIbash, zsh, PowerShellcmd, PowerShell ISEGNU coreutils, fishsubprocess (Python), ProcessBuilder (Java)APIDoxygen, Swagger, PostmanWinSDK, API Monitorman pages, straceOpenAPI Generator, gRPCDLLdumpbin, objdump, lddDependency Walker, regsvr32readelf, nmctypes, JNA, P/InvokeCOMOleView, MIDLregsvr32, COMAdminWine (模拟)pywin32, .NET InteropMCPMCP Inspector, Claude DesktopmcpCLInpx modelcontextprotocol/inspectorPython/TS SDK深入解析关键点不同OS下的“DLL”虽然名字不同.dll/.so/.dylib但工具原理相似——都涉及动态链接器Windows:ntdll.dll中的LDRLinux:ld-linux.somacOS:dyld。COM的类似物在Linux上有DBus也是进程间通信对象模型但工具链完全不同dbus-send,gdbus。MCP是新协议工具尚在快速演进但其核心工具始终是JSON-RPC调试器如jq配合stdio和SSE客户端如curl配合Server-Sent Events。

更多文章