Динамически созданный класс для 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.