如何通过命令行工具检查.Net dll是否使用COM互操作服务
判断.NET程序集是否使用COM互操作的命令行方法
有多个现成的命令行方案可以实现这个检测,核心判断逻辑很简单:所有通过COM互操作导入的非托管COM类型,在.NET程序集元数据中一定会标记System.Runtime.InteropServices.ComImportAttribute,只要检测到任意类型携带该特性,即可判定程序集使用了COM互操作服务,不存在误判或漏判。
可用的工具和操作方式如下:
- 用.NET SDK/Visual Studio自带的
ildasm(IL反汇编工具):无需额外安装,直接在命令行执行以下命令即可,有匹配输出就代表使用了COM互操作ildasm /text 目标程序集路径.dll | findstr "ComImport" - 用跨平台命令行反编译工具
ilspycmd:支持Windows、macOS、Linux,兼容所有版本的.NET程序集。先通过dotnet全局工具安装:
安装完成后执行检测命令,Windows环境用dotnet tool install -g ilspycmdfindstr匹配,macOS/Linux环境替换为grep即可:ilspycmd 目标程序集路径.dll | findstr "ComImport" - 不想装额外工具的话,直接用PowerShell调用.NET内置反射能力就能检测,复制以下脚本替换程序集路径运行即可:
$asm = [System.Reflection.Assembly]::LoadFrom("目标程序集绝对路径.dll") $comImportTypes = $asm.GetTypes() | Where-Object { $_.GetCustomAttributes([System.Runtime.InteropServices.ComImportAttribute], $false).Count -gt 0 } Write-Host ($comImportTypes ? "程序集使用了COM互操作服务" : "程序集未使用COM互操作服务")
两类代码的特征对比如下:
未使用COM互操作的普通类型没有特殊特性标记,示例:
internal class ServerClass { }
使用COM互操作导入的类型会显式标记
ComImport和对应COM类型的GUID,示例:
[ComImport] [Guid("114383E9-1969-47D2-9AA9-91388C961A19")] internal class ServerClass { }
内容的提问来源于stack exchange,提问作者Evgeniy Berezovsky
相关产品推荐
相关产品推荐

