Если я правильно помню, функции должны быть членами класса в мире CLR, а глобальные функции возможны в C++/CLI. Означает ли это, что эти глобальные функции являются частью какого-то скрытого «глобального» класса? Если да, то как можно получить его тип для целей отражения?
C++/CLI Какой класс содержит глобальные функции?
Ответы (2)
Да, метаданные .NET поддерживают глобальные функции и переменные. Называется «Глобальный класс» в исходном коде CLR, его имя — <Module>. Используя язык C#, это internal, abstract и sealed, чтобы гарантировать, что вы никогда не сможете создать экземпляр класса, а угловые скобки помогают избежать случайного создания повторяющегося типа.
Технически вы можете подумать об этом, вам понадобятся BindingFlags.NonPublic и BindingFlags.Static. Имейте в виду, насколько это непрактично, вам нужно использовать искаженное имя C++, чтобы найти что-нибудь обратно. По крайней мере, файл компоновщика .map или дизассемблер типа ildasm.exe должны знать имя. Остерегайтесь, что это довольно беспорядочно, многие идентификаторы CRT оказываются в этом классе для типичного проекта C++/CLI. Немного ошибка.
И последнее, но не менее важное: код в <Module> почти всегда является ошибкой. За исключением неясных причин обратного вызова, вам всегда нужен управляемый код внутри класса ссылки. Особенно, если вы хотите задуматься об этом. И что еще более тревожно, слишком много собственного кода C++ скомпилировано в MSIL. Это работает слишком хорошо, любой код, совместимый с С++ 03, может быть скомпилирован в MSIL, поэтому вы просто не можете сказать, что вы в основном получаете худшее из обоих миров. Важно строго отделить C++/CLI от собственного кода C++, что проще всего сделать с проектом статической библиотеки.
На самом деле это класс под названием «‹Module›» (с угловыми скобками), который не находится ни в одном пространстве имен. Этот класс фактически присутствует в обычных сборках C#.