使用Start-Process的-ArgumentList调用gacutil.exe时触发“Invalid Argument”错误求助
解决gacutil.exe "Invalid Argument" 错误的实操方案
嘿,我看你在调用gacutil卸载程序集时碰到了无效参数的问题,大概率是参数格式不对导致的——gacutil的/u参数可不是认文件路径的,得用程序集的强名称标识才行。下面一步步帮你搞定:
1. 先搞懂gacutil /u 参数的正确打开方式
gacutil的/u是用来卸载全局程序集缓存(GAC)里的程序集,它要的是程序集的完整强名称,比如这种格式:
gacutil.exe /u "USB.CRM.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abc123def456"
你现在传的"USB\CRM\Common"更像个文件路径或者不完整的名称,gacutil完全摸不着头脑,自然报错啦。
2. 拿到目标程序集的正确标识
不知道强名称没关系,用PowerShell就能查:
找到你的DLL文件(比如USB.CRM.Common.dll),然后在PowerShell里跑这个命令,把路径换成你自己的:
[System.Reflection.AssemblyName]::GetAssemblyName("C:\你的DLL存放路径\USB.CRM.Common.dll")
执行后会输出一堆信息,比如名称、版本、文化、公钥标记,把这些完整复制下来,这就是你要传给/u的参数。
3. 修正你的PowerShell命令
把拿到的完整标识替换进去,还要注意几个细节:
- 确认gacutil的路径是对的(你用的
v8.1A的SDK路径没问题,但如果你的系统装了更高版本的SDK,也可以对应调整) - 给程序集标识套上双引号,避免空格或特殊字符搞砸参数解析
修正后的命令示例(把里面的标识换成你自己查出来的):
$gacutilPath = "C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\gacutil.exe" $assemblyFullName = "USB.CRM.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1234567890abcdef" Start-Process -Wait -FilePath $gacutilPath -ArgumentList '/u', "`"$assemblyFullName`""
这里用了转义的双引号",确保gacutil能完整接收整个标识参数。
4. 额外踩坑提示
- 如果你其实是想安装程序集到GAC,那得用
/i参数,后面跟DLL的完整路径,比如:
Start-Process -Wait -FilePath $gacutilPath -ArgumentList '/i', "C:\你的DLL存放路径\USB.CRM.Common.dll"
- 记得用管理员权限运行PowerShell!修改GAC需要权限,虽然你现在的错误是参数问题,但后续操作可能会碰到权限报错
- 先验证gacutil路径是否正确:直接在PowerShell里跑
& "$gacutilPath" /?,如果能输出帮助信息,说明路径没问题;如果不行,得找对正确的gacutil位置(比如NETFX 4.8 Tools的路径会不一样)
内容的提问来源于stack exchange,提问作者SQLServerNewBie2
相关产品推荐
相关产品推荐

