Динамически созданный класс в CS-файл? - PullRequest
0 голосов
/ 14 сентября 2018

Я создаю сложный класс с AssemblyBuilder, из которого я позже создаю объекты. Однако существует неопределенность в том, как этот класс действительно построен. Так есть ли способ записать этот динамически созданный класс в CS-файл для проверки?

Я могу записать файл dll на диск, но мне нужен файл cs.

Ответы [ 4 ]

0 голосов
/ 22 сентября 2018

Вам необходимо использовать отражение .NET.

Ildasm.exe не может вам помочь, поскольку он не создаст нужный файл .cs.

Так что либо ILSpy являетсябраузер сборок с открытым исходным кодом .NET и декомпилятор от команды SharpDevelop или dotPeek от Jetbrains.

В зависимости от платформы вы также можете проверить Mono Cecil.Cecil - это библиотека, написанная Jb Evain для генерации и проверки программ и библиотек в формате ECMA CIL.

Если вам нужна скорость JustDecompile от Telerik, это бесплатный инструмент для просмотра и декомпиляции сборки .NET, который утверждает, чтоБыть в 10 раз быстрее конкурентов.

Все эти инструменты позволяют вам взять существующую скомпилированную сборку (.dll или .exe) и легко просматривать содержащиеся в ней символы, а затем так же легко декомпилировать язык ассемблера обратно в читаемый C #и ил.

0 голосов
/ 20 сентября 2018

У вас есть требование использовать AssemblyBuilder? Я спрашиваю, потому что AssemblyBuilder не позволит вам увидеть сгенерированный класс без использования декомпилятора, и если генерируемый вами класс достаточно сложен, декомпилированный код не будет хорошего качества.
Вы почти в той же ситуации, если используете Reflection.Emit, потому что он генерирует IL низкого уровня.
Если вам действительно нужно увидеть исходный код, который вы генерируете динамически, лучшим вариантом будет CodeDom. Вот пример Как: создать класс с использованием CodeDOM

0 голосов
/ 22 сентября 2018

Вы можете убить двух зайцев одним выстрелом с помощью Roslyn (он же "Платформа компилятора .NET"). Вам понадобится пакет Microsoft.CodeAnalysis.CSharp.

Во-первых, вы можете использовать класс SyntaxFactory для генерации синтаксических узлов, которые вы можете объединить в более крупные структуры (члены, методы, классы, пространства имен, единицы компиляции).
Вы также можете получить красиво отформатированное представление ваших синтаксических узлов с помощью ToString() или ToFullString() (с правильными отступами и переносами строк и всем прочим), что вы и искали изначально.

В Интернете довольно много уроков по использованию этого API (например, 1 , 2 ), и есть веб-сайт Roslyn Quoter , который может конвертировать кусок кода C # в SyntaxFactory звонках.

Во-вторых, вы можете затем использовать полученный CSharpSyntaxNode для создания CSharpSyntaxTree, который вы можете скомпилировать в IL с помощью CSharpCompilation (в конце концов, Roslyn является эталонным компилятором C # ).
Если вы хотите, вы можете даже сгенерировать сборку сборки в поток, получить оттуда двоичные данные сборки, загрузить вновь созданную сборку в текущую выполняемую сборку и динамически создать экземпляры только что определенных вами типов.

0 голосов
/ 18 сентября 2018

Вы можете декомпилировать управляемый код .NET dll в C #, используя

  • DotPeek от JetBrains (бесплатно, источники закрыты)
  • ILSpy проект с открытым исходным кодом (источники лицензий MIT доступны по адресу github )
  • Отражатель от Red Gates (Платный инструмент, источники закрыты)
  • JustDecompile от Telerik (бесплатно с механизмом декомпиляции с открытым исходным кодом, доступным по github Лицензия Apache)
  • Существует также инструмент Microsoft ildasm .

Если вам нужно написать собственный инструмент, вы можете загрузить открытый код и попробовать его.

...