我玩了.NET分析API(ICorProfilerCallback),很快就发现FunctionID并不稳定(它可以重用,见 http://msdn.microsoft.com/en-us/library/bb384619.aspx)。没事。我想出了使用模块版本ID(MVID)和方法令牌(mdTokenDef)对方法进行编码的想法。
但是,我担心这是空间无效的(GUID 为 16 字节 + 令牌为 4 字节)。现在我考虑使用某种哈希(我认为 32 位哈希应该足够了)。
您怎么看,有没有更好的方法来编码方法?
弄错,在应用程序域被拆除之前,函数ID是稳定的。 FunctionUnloadStarted 回调是从符号表中清除 id 的最直接方法。
小心泛型。 例如,当Foo和Bar是引用类型时,List<Foo>
和List<Bar>
的方法共享相同的函数id。 这是工作中的代码重用,是 .NET 泛型的一项功能。