【问题标题】:How can I programmatically determine if a DLL is managed or unmanaged?如何以编程方式确定 DLL 是托管的还是非托管的?
【发布时间】:2013-03-20 08:08:51
【问题描述】:

如何在程序中确定 DLL 是托管代码还是非托管代码?我们使用this code 来确保我们所有的托管DLL 都是MSIL。但它会在非托管 DLL 上引发异常,因此我需要一种方法来首先检查 DLL 是否是托管的。

【问题讨论】:

  • 你多久做一次?有时你只需要处理异常并继续前进,我不知道是否有一种简单(无异常)的方法来解决这个问题。
  • @ScottChamberlain 它在构建过程中,所以不是很受欢迎。我只是不喜欢在代码按预期运行时出现异常。
  • @DavidThielen 有办法做到这一点,但有点复杂,因为没有直接的 API。就个人而言,我会采用这种方法来捕捉异常,因为它既简单又干净......

标签: .net managed


【解决方案1】:

最简单的选择很可能是尝试按原样打开文件并捕获异常。任何非托管程序集都会在 Assembly.LoadFrom 上引发异常。

但是,如果您想更严格地确定这一点,您需要自己检查 PE 标头以获取适当的信息。这个article describes the process很详细,但是需要检查DLL的PE头的IMAGE_OPTIONAL_HEADER结构。

【讨论】:

  • 他们肯定不会那么容易做到的 :) 谢谢
  • @DavidThielen 不 - 不幸的是,没有简单的 API,即使在本机方面也是如此。
  • @DavidThielen 在开始编写代码之前,请考虑一下所涉及的时间。如果处理异常可能会增加 2 毫秒的构建时间,而不是写出解析 PE 标头的方法,如果 (Time involved to write the handler / Time difference between exception handling and detecting) < Number of builds in the lifetime of the program 不值得这样做,请做一些数学运算。
猜你喜欢
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
  • 2012-03-17
相关资源
最近更新 更多