Динамически созданный класс для cs файла?
Я создаю сложный класс с AssemblyBuilder, который позже создает объекты. Тем не менее существуют неопределенности в том, как этот класс действительно решается. Итак, есть ли способ записать этот динамически созданный класс в файл cs для проверки?
Я могу получить файл dll, записанный на диск, но мне нужен файл cs.
Ответы
Ответ 1
Вы можете декомпилировать управляемую.NET dll в код С#, используя
- DotPeek от JetBrains (бесплатно, источники закрыты)
- ILSpy проект с открытым исходным кодом (источники лицензии MIT доступны в github)
- Отражатель от Red Gates (платный инструмент, источники закрыты)
- JustDecompile от Telerik (бесплатно с движком декомпиляции с открытым исходным кодом, доступным на Gigub Apache License)
- Существует также инструмент ildasm для Microsoft.
Если вам нужно написать собственный инструмент, вы можете скачать его с открытым исходным кодом и попробовать.
Ответ 2
У вас есть требование использовать AssemblyBuilder
? Я спрашиваю, потому что AssemblyBuilder
позволит вам видеть сгенерированный класс, не используя декомпилятор, и если класс, который вы создаете, довольно сложный, декомпилированный код не будет хорошего качества.
Вы почти в той же ситуации, если используете Reflection.Emit
потому что он генерирует IL-уровень низкого уровня.
Если вам действительно нужно видеть исходный код, который вы генерируете динамически, лучшим вариантом является CodeDom
. Вот пример Как создать класс с помощью CodeDOM
Ответ 3
Вы могли бы убить двух птиц одним камнем с Roslyn (иначе ".NET Compiler Platform"). Вам понадобится пакет Microsoft.CodeAnalysis.CSharp
.
Во-первых, вы можете использовать класс SyntaxFactory
для генерации узлов синтаксиса, которые вы можете объединить в более крупные структуры (члены, методы, классы, пространства имен, единицы компиляции).
Вы также можете получить красиво отформатированное представление ваших синтаксических узлов с ToString()
или ToFullString()
(с правильным отступом и разрывами строк и т.д.), Из которого вы и искали.
В Интернете есть несколько руководств по использованию этого API (например, 1, 2), а также веб- сайт Roslyn Quoter, который может конвертировать кусок кода С# в вызовы SyntaxFactory
.
Во-вторых, вы можете использовать полученный CSharpSyntaxNode
для создания CSharpSyntaxTree
, который вы можете скомпилировать в IL с помощью CSharpCompilation
(в конце концов, Roslyn является ссылочным С# -компилятором).
Если вы хотите, вы можете даже генерировать сборку сборки в потоке, получать из нее двоичные данные сборки и загружать новую созданную сборку в свою исполняемую сборку и динамически создавать типы, которые вы только что определили.
Ответ 4
Вы должны использовать отражение.NET.
Ildasm.exe не может помочь вам, потому что он не создаст файл.cs, который вам нужен.
Таким образом, ILSpy
представляет собой ILSpy
с открытым исходным кодом.NET и декомпилятор от команды SharpDevelop или dotPeek
от Jetbrains.
В зависимости от платформы вы также можете проверить Mono Cecil
. Cecil - это библиотека, написанная Jb Evain для создания и проверки программ и библиотек в формате ECMA CIL.
Если вам нужна скорость, JustDecompile
от Telerik - бесплатный инструмент для просмотра и декомпиляции в сборке.NET, который утверждает, что он в 10 раз быстрее конкурентов.
Все эти инструменты позволяют вам взять существующую скомпилированную сборку (DLL или.exe) и легко просматривать содержащиеся в ней символы, а затем просто декомпилировать язык ассемблера на читаемые С# и IL.