Blittable Vs. Не Blittable в IL
Я пытаюсь убедиться, что мои звонки с управляемых на неуправляемые оптимизированы. Есть ли быстрый способ увидеть, посмотрев на IL, какие-нибудь неблизкие типы случайно попали в мои вызовы пинвока?
Я попытался просто написать две неуправляемые функции в.dll, одну, которая использует bool (которая не является blittable) и одну, которая использует целые числа. Но я не видел ничего иного, когда смотрел на ИЛ, чтобы дать мне понять, что он делает что-то еще, чтобы выстроить бул.
3 ответа
В IL нет вещей, связанных с маршалингом. Вместо этого вы должны анализировать типы параметров методов (с модификаторами) и возвращаемые типы, следуя правилам, описанным в MSDN. Эти правила довольно просты, должна быть возможность написать автоматическую проверку и подключить ее, например, к FxCop.
Антон Тихий прав. Анализ типов - это то, что вам нужно; поиск по IL не поможет вам. Я рекомендую прочитать следующие статьи, чтобы решить, правильно ли вы это делаете.
- Blittable и Non-Blittable Типы
http://msdn.microsoft.com/en-us/75dwhxf7.aspx - Копирование и закрепление
http://msdn.microsoft.com/en-us/23acw07k.aspx - CLR Inside Out: маршалинг между управляемым и неуправляемым кодом
http://msdn.microsoft.com/en-us/cc164193.aspx - .NET Column: P / Invoke Revisited
http://msdn.microsoft.com/en-us/cc163910.aspx - Обзор совместимости управляемого / неуправляемого кода
http://msdn.microsoft.com/en-us/library/ms973872.aspx
Надеюсь, поможет.
В IL нет вещей, связанных с маршалингом.
Это не правда.
Даже для "bool" может потребоваться выполнить маршалинг в зависимости от того, как "bool" определено в неуправляемом языке. Например, только в MS C++ есть два типа 'bool', который составляет 1 байт, и 'BOOL', который составляет 4 байта. С другой стороны, я думаю, .Net bool имеет размер 1 байт, поэтому вам, возможно, придется указать, как его упорядочить в зависимости от размера неуправляемого bool.