【问题标题】:How to determine if DLL is COM or .NET?如何确定 DLL 是 COM 还是 .NET?
【发布时间】:2011-03-01 23:33:56
【问题描述】:

我有一个更新程序,从服务器提取的文件在一个目录中混合了 vb6 dll 和 .net DLL。

如何判断一个 dll 是否是 COM 的? (所以我可以从更新程序调用regsvr32

【问题讨论】:

  • 为什么不做正确的事,注册那些你知道是COM服务器的,跳过那些不是的?您应该拥有该信息,并且可以在安装程序中对其进行编码。
  • @Tim - 我想可能存在这样一种情况,即代码的发布者与消费者不是同一个组织 - 否则我同意 - 明确控制流程。
  • @AJ - 这并不意味着人们无法弄清楚并测试它。我的观点是,如果它是您安装过程的一部分,您应该知道必须注册什么。不这样做是草率和不专业的。这是一个简单的预先测试。当您需要做的只是事先确定时,为什么还要添加代码?
  • @Tim - 正如我所说,我同意你的看法。我只是假设一个可能相关的场景。根据经验,有时即使在同一家公司,人们也不会交流(并且不鼓励这样做)——这可能是“完成任务”的场景。
  • @Tim: 两个字(三个字):基于插件的系统

标签: .net vb6


【解决方案1】:

我想一种方法是尝试使用System.Reflection.Assembly.LoadFile() (more info) 加载文件。如果您收到BadImageFormatException,则它不是有效的 .NET 程序集。这样做可能有一种更简洁的方法,但这应该可行。

【讨论】:

  • 这似乎需要大量的工作来编写一个安装程序来执行此操作,而不是仔细跟踪哪些 DLL 需要注册。但无论如何都要 +1
【解决方案2】:

为什么不对所有这些都调用 regsvr。如果他们注册了就可以了,如果没有什么大不了的。

最好编写一个安装程序,了解哪些是哪些,并为每个安装程序做正确的事情。

编辑

如果您担心“发出错误”,请不要担心。

See this usage

您可以隐藏消息。 (/s)

【讨论】:

  • @Hao - 尽管我有其他答案,但我同意 Tim。
  • @AJ:盲目 regsvring 的问题,如果 DLL 是 .NET 类型,regsvr32 会发出错误
  • 我已经在使用 /S。它在 XP 上抑制错误消息,但在 Vista 上显示错误
  • @Hao - 检查以确保您以管理员身份运行该命令。如果 UAC 权限不正确,则 /s 标志将不起作用,因为操作系统永远不会让您走那么远。
【解决方案3】:

要正式执行此操作,您可以检查 PE 以了解有关每个 dll 导出的内容类型的更多信息。有a pretty interesting article on MSDN 谈论结构。如果您了解设置,则可以识别到 .Net 的链接(因此缺少表示纯 COM dll)。

【讨论】:

  • 我今天的票用完了。我会回来投票给这个。这是一个很好的技术答案。
  • @ Tim - 谢谢 :) 这不适合胆小的人,但只要稍加努力,它就可以提供一个非常可靠的解决方案。如果场景比组装更高级别,这种方法应该是可靠的(阅读:不需要处理太多“优化”的 PE)。
猜你喜欢
  • 1970-01-01
  • 2012-01-10
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多