问题标签 [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.
.net - 在 IMetadataImport 或 MonoCecil 中,如何确定内部类中的方法是否可以从其他程序集访问?
可以从程序集外部访问内部类的公共方法的一种情况是,该方法实现了接口方法或覆盖了在公共基类中定义的虚拟方法。
使用 IMetadataImport,如何确定特定 mdMethodDef 是否属于这种情况?
更新:我也想知道如何在 Mono.Cecil 中执行此操作,因为这可能会帮助我弄清楚如何在 IMetaDataImport 中执行此操作。
c# - 如何通过 Profiling API(ICofProfilerInfo 或任何 IMetadataImport 或任何其他方式)读取 System.Threading.Thread.ThreadState
有没有办法通过 Profiling API ICofProfilerInfo 或 IMetadataImport 接口或任何其他方式从非托管代码中读取托管线程的 System.Thread.ThreadState 属性?
例如这样的:
c# - IMetaDataImport::ResolveTypeRef 方法的问题
我有自己的调试器,用于使用IMetaDataImport
接口的 .NET 应用程序
当我调用ResolveTypeRef
方法时,我总是得到NotImplementedException
.
的定义ResolveTypeRef
是这样的:
方法调用:
通常,该方法应解析 System.Exception 或 System.SystemException 类型。
当我将应用程序从 .NET 3.5 移动到 .NET 4 时出现了问题。
感谢您的回答!
c# - IMetaDataImport2::EnumGenericParams 方法不起作用
在用 IMetaDataImport解决了一个问题后,我正在处理另一个问题很长一段时间。它使用EnumGenericParams方法。
该方法抛出 AccessViolationExpcetion,但这只是有时发生。在其他情况下,该方法从调用返回没有任何问题,但其参数与抛出异常时的参数相同。我不知道为什么只是有时。
此外,不能通过 catch 语句捕获 AccessViolationExpcetion。在 VS 2010 中调试时,首先捕获异常 TargetInvocationException,并将 InnerException 设置为 AccessViolationExpcetion。
IMetaDataImport2 和 EnumGenericParams 的定义:
方法调用:
(即使调用第三个参数不为空且第四个> 0 也会导致异常。)
当我将应用程序从 .NET 3.5 移动到 .NET 4 时出现了问题。
感谢您的任何帮助!
c# - 使用 IMetaDataImport EnumMethods 获取基类层次结构方法
我正在尝试实现查看 MDBG 示例的托管调试器。
MDBG 能够解析给定范围内的函数名称,但它没有考虑基类。
MDBG 正在这样做:
虽然 Type.GetMethods() 被覆盖并具有此实现,但使用 IMetaDataImport.EnumMethods:
问题是m_importer.EnumMethods()枚举表示指定类型的方法的 MethodDef 标记,但我对类层次结构中的所有方法感兴趣。
如何获取类层次结构中定义的所有方法?(显然,不能使用反射等常用方法,因为我正在分析其他进程中定义的类型)
我对互操作和深层 CLR/CIL 结构的了解有限,这阻碍了我找到正确的方法。
欢迎任何意见/建议!
问候,
c# - 使用 ICorDebugEval 的泛型 func-eval
我正在使用 MDBG 示例制作托管的 .NET 调试器。
MDBG 不支持我正在尝试添加的属性获取器评估。请考虑以下类结构:
在某个时间点,我正在创建 A 的一个实例并在断点处停止以评估它的状态。
在我的调试器的监视窗口中,我介绍了“this.SomeProp”,它应该在这个对象上执行 get_SomeProp 方法的 func-eval 并为给定的情况返回一个空值。
我遇到的第一个问题是 get_SomeProp 是在基类上定义的,因此我必须遍历类层次结构中的所有 TypeDefs/TypeRefs/TypeSpecs 才能找到该函数。
但是找到之后,打电话
导致:TypeLoadException: 泛型类型在程序集中使用了错误数量的泛型参数。
正如我所意识到的那样,因为非泛型函数是在泛型类(Base)中定义的,所以当我评估它时,我还应该指出类的泛型参数。
这可以使用
问题是我不知道如何提取类泛型参数的类型,只有我想要评估的函数和我想要评估它的实例。
这是我目前正在使用的一些代码:
非常感谢任何建议/建议!
问候,
解决方案
感谢@Brian Reichle 出色的回答,我想出了这个解决方案:
以及函数本身:
c# - 多态类的函数评估
我正在使用 MDBG 示例制作托管的 .NET 调试器。
MDBG 示例仅对给定实例的顶级类进行操作,而不是在类层次结构内部进行深入搜索。我能够通过层次结构并获得所有可用的方法。但是在这种情况下会出现问题:
问题是当我将 castedToBase 作为 ICorDebugValue 并查询它的 ICorDebugValue2::GetExactType 时,我得到的是 A 类而不是 Base 类。那时我无法再区分调用哪个方法 get_SomeProp 了。我希望 ICorDebugValue2::GetExactType 考虑执行的强制转换,而不总是返回底层类型。
我如何理解我应该调用哪种方法?
下面列出了我现在正在做的一些代码。mdbgValue表示 castedToBase 对象。szTypedef 返回“A”而不是预期的“Base”
c# - 调试器 StepInto 自动生成代码和 JMC 问题
我正在使用 MDBG 示例制作托管的 .NET 调试器。
目前我正在努力解决 StepInto 的行为,而 StepOut 和 StepOver 似乎可以工作。
为了实现Just-My-Code
步进,我正在调用SetJMCStatus
模块加载。这很好用,让我只调试我的代码。
但是由于我将整个模块设置为 JMC,一些自动生成的代码开始发挥作用并破坏了单步执行。此类代码的一个示例可能是自动属性。
由于调试器正在执行 Il 指令,因此我进入了自动生成的方法get_propertyName
和set_propertyName
方法,这些方法被标记为我的代码,因为它们是我的模块的一部分。
为了将这种自动生成的代码与我的代码区分开来,我可以使用调试符号的存在,在自动生成代码的情况下会丢失这些符号。然后我可以简单地将方法标记为不是我的代码,以便在步进期间跳过它。
问题是我不知道在步进过程中进入内部之前会自动生成哪些方法。当我进入一个没有调试符号的方法时,我可以将其标记为不是我的代码,但为时已晚 - 调试器在它不应该停止的地方停止了。
从理论上讲,我可以使用 IMetadataImport 迭代我的模块方法,并在调试器启动时设置它们的 JMCStatus,但这似乎相当昂贵:
如果我知道接下来要执行什么函数,那么我将能够设置它的状态并防止第一次进入自动生成的代码。
我坚持使用 MDBG 方法进行步进,不更改任何内容,只是在需要的地方调用 SetJMCStatus,所以我不确定提供任何代码是否有意义......如果是这样,我将编辑问题,只需添加一条评论!
非常感谢您对主题的任何建议!
问候,
c++ - 使用 GetFunctionInfo 从 FunctionID 中获取函数的名称
我正在使用该ICorProfilerInfo
接口编写 CLR 分析器。
使用SetEnterLeaveFunctionHooks
时,回调方法传递一个FunctionID
.
如何获取给定 this 的函数的元数据(特别是我的名字)FunctionID
?
一篇 MSDN 文章建议第一次调用应该是GetFunctionInfo
. 此功能的文档指出:
探查器代码可以调用 ICorProfilerInfo::GetModuleMetaData 来获取给定模块的元数据接口。然后可以使用返回到 pToken 引用的位置的元数据令牌来访问函数的元数据。
它没有详细说明最后一句话('元数据令牌......可用于访问函数的元数据')。这是如何运作的?
到目前为止,我正在执行以下操作:
我试过这样打电话GetTypeRefProps
:
最后的调用返回S_FALSE
,并且不填充szName
。
c++ - 使用 GetFieldProps 获取类的属性值
我正在尝试使用GetFieldProps获取类中字段的值
最初我GetClassLayout
用来获取 FieldDef 令牌数组,然后使用GetFieldProps
.
每次调用的结果都会GetFieldProps
返回 S_OK
并填充.szField
我在ExceptionThrown
回调中调用尝试这个,当尝试这个异常时,它返回字段名称_className
等_message
,但ppValue
始终为空,原样pcchValue
。
如何获取类中字段的值?
这是我当前方法的一个示例(删除了声明等):