【问题标题】:Mono.Cecil - How can I found out PInvoke DLL name?Mono.Cecil - 如何找到 PInvoke DLL 名称?
【发布时间】:2019-01-09 13:04:21
【问题描述】:

Mono.Cecil 通过method.IsPInvokeImpl 提供了一种检查方法是否为pinvoke 的方法,并且还通过method.PInvokeInfo 提供了更多信息。我怎样才能找到 dll 名称?

【问题讨论】:

  • .Attributes吗?相关数据是DllImportAttribute 元数据(特别是Value)的一部分。
  • .Attributes 是一个枚举,method.HasCustomAttributes 也返回 false。
  • 啊。我的错,DllImport 只是 C# 编译器假装的喧嚣。实际的 IL 包含入口点数据作为pinvokeimpl 属性的一部分。 .PInvokeInfo.Module.Name 中没有你需要的东西吗? (我这里严格按照 Cecil 源代码进行,没有要测试的实际代码。)
  • @JeroenMostert,正确。发布答案。

标签: cil mono.cecil


【解决方案1】:

P/Invoke 方法的 IL 如下所示(例如,kernel32!LockFile):

.method assembly hidebysig static pinvokeimpl("kernel32.dll" lasterr winapi) 
    bool LockFile (
        class Microsoft.Win32.SafeHandles.SafeFileHandle handle,
        int32 offsetLow,
        int32 offsetHigh,
        int32 countLow,
        int32 countHigh
    ) cil managed preservesig 
{
}

Mono.Cecil 镜像PInvokeInfo 类中的pinvokeimpl 元数据,第一个字符串打包为ModuleReference。因此,method.PInvokeInfo.Module.Name 给出了 DLL/dylib 名称。

【讨论】:

    猜你喜欢
    • 2012-07-25
    • 2018-07-22
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 2010-09-24
    • 2010-11-30
    • 1970-01-01
    相关资源
    最近更新 更多