Как получить уникальный идентификатор метода в профилировщике .NET (ICorProfilerCallback)?

Я поиграл с API профилирования .NET (ICorProfilerCallback) и быстро обнаружил, что FunctionID нестабилен (его можно использовать повторно, см. http://msdn.microsoft.com/en-us/library/bb384619.aspx). Все в порядке. Мне пришла в голову идея закодировать метод с помощью идентификатора версии модуля (MVID) и токена метода (mdTokenDef).

Однако меня беспокоит, что это пространство неэффективно (16 байтов для GUID + 4 байта для токена). Прямо сейчас я думаю использовать какой-то хеш (я думаю, 32-битного хеша должно быть достаточно).

Как вы думаете, есть ли более эффективные способы кодирования метода?


person Nullptr Dev    schedule 01.05.2012    source источник


Ответы (1)


Трудно понять это неправильно, идентификаторы FunctionID остаются стабильными до тех пор, пока домен приложения не будет отключен. Обратный вызов FunctionUnloadStarted - это наиболее прямой способ удалить идентификатор из таблицы символов.

Остерегайтесь дженериков. Например, методы List<Foo> и List<Bar> используют один и тот же идентификатор функции, когда Foo и Bar являются ссылочными типами. Это повторное использование кода на работе, особенность универсальных шаблонов .NET.

person Hans Passant    schedule 01.05.2012
comment
Спасибо за быстрый ответ. Я не думал о дженериках. Думаю, я легко исправлю это, используя mdMethodSpec там, где это необходимо. Спасибо. - person Nullptr Dev; 02.05.2012