如何在没有实际 dll 的情况下注销 .Net 组件

Posted

技术标签:

【中文标题】如何在没有实际 dll 的情况下注销 .Net 组件【英文标题】:How to unregister .Net component without actual dll 【发布时间】:2013-05-31 21:33:08 【问题描述】:

我更新了自定义 .Net 组件,但忘记先取消注册以前的版本。

我没有取消注册,而是将新的 dll 复制到旧版本上。

组件暴露给 COM,现在我在经典 ASP 页面上收到“无法创建对象”消息。

我猜旧的组件信息保留在注册表或系统其他地方的某个地方。有没有办法在没有实际 dll 的情况下删除/卸载/注销这些信息?

我尝试使用 Regasm 工具取消注册组件,但现在我只能提供新 dll 的路径,因为旧 dll 已被覆盖。

还有其他方法可以从系统中删除旧版本信息并只注册新的 dll 吗?

谢谢!

【问题讨论】:

How to unregister my .net assembly when it's no longer in the same location? 的可能重复项 【参考方案1】:

忘记注销程序集只会在注册表中留下垃圾。这是草率且很难摆脱的,但肯定不是世界末日。许多较旧的机器都有很多这样的垃圾,注册表清洁工声称要摆脱的那种垃圾。顺便说一句,这不是对此类工具的认可。

它不会阻止更新的程序集正常工作。假设你做对了并且正确地运行了 Regasm.exe,使用了 /codebase 选项,这样你就不会打扰 GAC 并且还更新了 ASP 项目中的类型库引用。后者是被忽略的典型步骤,它可能仍使用旧的注册密钥。

应对措施是(暂时)在接口和类声明上使用 [Guid] 属性。这样用于注册组件的注册表项总是相同的。您不能以这种方式在注册表中添加垃圾,更新将始终覆盖相同的键。假设您没有添加任何接口或类或更改 DLL 的路径,您甚至可以跳过更新的注册步骤。

但是,您应该在项目稳定后再次删除那些 [Guid] 属性并且您即将发布。不这样做会调用 DLL Hell,没什么好惹的。

Regasm.exe /regfile 选项值得注意。您可以查看正在使用哪些注册密钥。

【讨论】:

嗨,汉斯,感谢您的回答。我没有更改任何 GUID,所以在这种情况下组件应该可以在不重新注册的情况下工作?然后可能是一些权限问题。无论如何,我得到“80070002 系统找不到指定的文件”。你曾经处理过这个错误吗? :) 嗯,“找不到文件”肯定是一个非常常见的错误。如果您不知道是什么原因造成的,请使用 SysInternals 的 ProcMon。你会看到它在寻找什么。

以上是关于如何在没有实际 dll 的情况下注销 .Net 组件的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 app.dll 和 app.runtimeconfig.json 的情况下运行 WPF .NET3.1 应用程序

如何在不停止站点的情况下更新 ASP.Net 站点 dll

有没有办法在不安装的情况下引用 ghostscript DLL?

如何在没有 TNS 的情况下构建到 Oracle 的 .NET 连接字符串?

不使用 DLL 时如何在没有依赖 DLL 的情况下运行?

如何在不改变状态的情况下对 redux 操作做出反应