问题标签 [imetadataimport]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
560 浏览

.net - 在 IMetadataImport 或 MonoCecil 中,如何确定内部类中的方法是否可以从其他程序集访问?

可以从程序集外部访问内部类的公共方法的一种情况是,该方法实现了接口方法或覆盖了在公共基类中定义的虚拟方法。

使用 IMetadataImport,如何确定特定 mdMethodDef 是否属于这种情况?

更新:我也想知道如何在 Mono.Cecil 中执行此操作,因为这可能会帮助我弄清楚如何在 IMetaDataImport 中执行此操作。

0 投票
1 回答
268 浏览

c# - 如何通过 Profiling API(ICofProfilerInfo 或任何 IMetadataImport 或任何其他方式)读取 System.Threading.Thread.ThreadState

有没有办法通过 Profiling API ICofProfilerInfo 或 IMetadataImport 接口或任何其他方式从非托管代码中读取托管线程的 System.Thread.ThreadState 属性?

例如这样的:

0 投票
1 回答
571 浏览

c# - IMetaDataImport::ResolveTypeRef 方法的问题

我有自己的调试器,用于使用IMetaDataImport接口的 .NET 应用程序

当我调用ResolveTypeRef方法时,我总是得到NotImplementedException.

的定义ResolveTypeRef是这样的:

方法调用:

通常,该方法应解析 System.Exception 或 System.SystemException 类型。

当我将应用程序从 .NET 3.5 移动到 .NET 4 时出现了问题。

感谢您的回答!

0 投票
1 回答
250 浏览

c# - IMetaDataImport2::EnumGenericParams 方法不起作用

在用 IMetaDataImport解决了一个问题后,我正在处理另一个问题很长一段时间。它使用EnumGenericParams方法。

该方法抛出 AccessViolationExpcetion,但这只是有时发生。在其他情况下,该方法从调用返回没有任何问题,但其参数与抛出异常时的参数相同。我不知道为什么只是有时。

此外,不能通过 catch 语句捕获 AccessViolationExpcetion。在 VS 2010 中调试时,首先捕获异常 TargetInvocationException,并将 InnerException 设置为 AccessViolationExpcetion。

IMetaDataImport2 和 EnumGenericParams 的定义:

方法调用:

(即使调用第三个参数不为空且第四个> 0 也会导致异常。)

当我将应用程序从 .NET 3.5 移动到 .NET 4 时出现了问题。

感谢您的任何帮助!

0 投票
1 回答
170 浏览

c# - 使用 IMetaDataImport EnumMethods 获取基类层次结构方法

我正在尝试实现查看 MDBG 示例的托管调试器。

MDBG 能够解析给定范围内的函数名称,但它没有考虑基类。

MDBG 正在这样做:

虽然 Type.GetMethods() 被覆盖并具有此实现,但使用 IMetaDataImport.EnumMethods:

问题是m_importer.EnumMethods()枚举表示指定类型的方法的 MethodDef 标记,但我对类层次结构中的所有方法感兴趣。

如何获取类层次结构中定义的所有方法?(显然,不能使用反射等常用方法,因为我正在分析其他进程中定义的类型)

我对互操作和深层 CLR/CIL 结构的了解有限,这阻碍了我找到正确的方法。

欢迎任何意见/建议!

问候,

0 投票
1 回答
251 浏览

c# - 使用 ICorDebugEval 的泛型 func-eval

我正在使用 MDBG 示例制作托管的 .NET 调试器。

MDBG 不支持我正在尝试添加的属性获取器评估。请考虑以下类结构:

在某个时间点,我正在创建 A 的一个实例并在断点处停止以评估它的状态。

在我的调试器的监视窗口中,我介绍了“this.SomeProp”,它应该在这个对象上执行 get_SomeProp 方法的 func-eval 并为给定的情况返回一个空值。

我遇到的第一个问题是 get_SomeProp 是在基类上定义的,因此我必须遍历类层次结构中的所有 TypeDefs/TypeRefs/TypeSpecs 才能找到该函数。

但是找到之后,打电话

导致:TypeLoadException: 泛型类型在程序集中使用了错误数量的泛型参数

正如我所意识到的那样,因为非泛型函数是在泛型类(Base)中定义的,所以当我评估它时,我还应该指出类的泛型参数。

这可以使用

问题是我不知道如何提取类泛型参数的类型,只有我想要评估的函数和我想要评估它的实例。

这是我目前正在使用的一些代码:

非常感谢任何建议/建议!

问候,


解决方案

感谢@Brian Reichle 出色的回答,我想出了这个解决方案:

以及函数本身:

0 投票
1 回答
135 浏览

c# - 多态类的函数评估

我正在使用 MDBG 示例制作托管的 .NET 调试器。

MDBG 示例仅对给定实例的顶级类进行操作,而不是在类层次结构内部进行深入搜索。我能够通过层次结构并获得所有可用的方法。但是在这种情况下会出现问题:

问题是当我将 castedToBase 作为 ICorDebugValue 并查询它的 ICorDebugValue2::GetExactType 时,我得到的是 A 类而不是 Base 类。那时我无法再区分调用哪个方法 get_SomeProp 了。我希望 ICorDebugValue2::GetExactType 考虑执行的强制转换,而不总是返回底层类型。

我如何理解我应该调用哪种方法?

下面列出了我现在正在做的一些代码。mdbgValue表示 castedToBase 对象。szTypedef 返回“A”而不是预期的“Base”

0 投票
1 回答
149 浏览

c# - 调试器 StepInto 自动生成代码和 JMC 问题

我正在使用 MDBG 示例制作托管的 .NET 调试器。

目前我正在努力解决 StepInto 的行为,而 StepOut 和 StepOver 似乎可以工作。

为了实现Just-My-Code步进,我正在调用SetJMCStatus模块加载。这很好用,让我只调试我的代码。

但是由于我将整个模块设置为 JMC,一些自动生成的代码开始发挥作用并破坏了单步执行。此类代码的一个示例可能是自动属性。

由于调试器正在执行 Il 指令,因此我进入了自动生成的方法get_propertyNameset_propertyName方法,这些方法被标记为我的代码,因为它们是我的模块的一部分。

为了将这种自动生成的代码与我的代码区分开来,我可以使用调试符号的存在,在自动生成代码的情况下会丢失这些符号。然后我可以简单地将方法标记为不是我的代码,以便在步进期间跳过它。

问题是我不知道在步进过程中进入内部之前会自动生成哪些方法。当我进入一个没有调试符号的方法时,我可以将其标记为不是我的代码,但为时已晚 - 调试器在它不应该停止的地方停止了。

从理论上讲,我可以使用 IMetadataImport 迭代我的模块方法,并在调试器启动时设置它们的 JMCStatus,但这似乎相当昂贵:

如果我知道接下来要执行什么函数,那么我将能够设置它的状态并防止第一次进入自动生成的代码。

我坚持使用 MDBG 方法进行步进,不更改任何内容,只是在需要的地方调用 SetJMCStatus,所以我不确定提供任何代码是否有意义......如果是这样,我将编辑问题,只需添加一条评论!

非常感谢您对主题的任何建议!

问候,

0 投票
1 回答
355 浏览

c++ - 使用 GetFunctionInfo 从 FunctionID 中获取函数的名称

我正在使用该ICorProfilerInfo接口编写 CLR 分析器。

使用SetEnterLeaveFunctionHooks时,回调方法传递一个FunctionID.

如何获取给定 this 的函数的元数据(特别是我的名字)FunctionID

一篇 MSDN 文章建议第一次调用应该是GetFunctionInfo. 此功能的文档指出:

探查器代码可以调用 ICorProfilerInfo::GetModuleMetaData 来获取给定模块的元数据接口。然后可以使用返回到 pToken 引用的位置的元数据令牌来访问函数的元数据。

它没有详细说明最后一句话('元数据令牌......可用于访问函数的元数据')。这是如何运作的?

到目前为止,我正在执行以下操作:

我试过这样打电话GetTypeRefProps

最后的调用返回S_FALSE,并且不填充szName

0 投票
1 回答
177 浏览

c++ - 使用 GetFieldProps 获取类的属性值

我正在尝试使用GetFieldProps获取类中字段的值

最初我GetClassLayout用来获取 FieldDef 令牌数组,然后使用GetFieldProps.

每次调用的结果都会GetFieldProps返回 S_OK并填充.szField

我在ExceptionThrown回调中调用尝试这个,当尝试这个异常时,它返回字段名称_className_message,但ppValue始终为空,原样pcchValue

如何获取类中字段的值?

这是我当前方法的一个示例(删除了声明等):