Сейчас на форуме: igorcauret, Rio (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Как добавить в скомпилированную .NET сборку свой код?
Посл.ответ Сообщение


Ранг: 71.9 (постоянный), 4thx
Активность: 0.040
Статус: Участник

Создано: 21 февраля 2015 16:49
· Личное сообщение · #1

Совсем ламер в .net, как программно добавить свой код в скомпилированную сборку на C# ?
Допустим это несколько строчек кода на C#. Вопросы такие:

- Как транслировать эти строчки C# в байткод?
- Как внедрить этот байткод в скомпилированную сборку .NET?




Ранг: 748.2 (! !), 390thx
Активность: 0.370
Статус: Участник
bytecode!

Создано: 21 февраля 2015 17:13
· Личное сообщение · #2

Какова конечная цель?

jangle пишет:
- Как транслировать эти строчки C# в байткод?

Скомпилировать (в той же VS).

jangle пишет:
- Как внедрить этот байткод в скомпилированную сборку .NET?

Много способов. Самые популярные - пропатчить сборку (тут тоже несколько вариантов - от прямого внедрения вашего IL до внедрения подгрузки вашей dll например) либо заинжектить своё добро в нужный домен.

-----
Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску.




Ранг: 80.6 (постоянный), 194thx
Активность: 0.10.04
Статус: Участник

Создано: 21 февраля 2015 17:23 · Поправил: v00doo
· Личное сообщение · #3

jangle можно ildasm -> ilasm:
http://habrahabr.ru/post/234101/

А нужный кусок просто самому собрать в VS и так же посмотреть.




Ранг: 71.9 (постоянный), 4thx
Активность: 0.040
Статус: Участник

Создано: 21 февраля 2015 17:25
· Личное сообщение · #4

4kusNick пишет:
Какова конечная цель?


Есть нативное приложение, которое вызывает COM .NET сборку и передает в нее данные для расчетов. Я хочу изменить условия обработки этих данных.
Например было:

Code:
  1.   private string ReadData(LabelType labelType, int bytesLen)
  2.         {
  3.              int readPower = labelType.ReadPower;
  4.              int writePower = labelType.WritePower;
  5.              .....
  6.          }


а чтобы стало:

Code:
  1.      private string ReadData(LabelType labelType, int bytesLen)
  2.         {
  3.  
  4.             int readPower = labelType.ReadPower;
  5.             int writePower = labelType.WritePower;
  6.  
  7.             if (readPower < 1 || readPower > 30) readPower = 16;
  8.             if (writePower < 1 || writePower > 30) writePower = 16;
  9.            ......


и чтобы добавляемые строчки брались из текстового файла к примеру




Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 21 февраля 2015 19:07
· Личное сообщение · #5

jangle

jangle пишет:
- Как транслировать эти строчки C# в байткод?


Заранее скомпилировать функцию в том виде в котором она вас полностью устраивает. Потом в зависимости от ваших целей, вы либо сделает патч, с помощью какого нибудь IL редактора. Либо можете это сделать сами с помощью библиотеки mono.cecil.

-----
have a nice day


| Сообщение посчитали полезным: jangle


Ранг: 748.2 (! !), 390thx
Активность: 0.370
Статус: Участник
bytecode!

Создано: 21 февраля 2015 19:28
· Личное сообщение · #6

jangle пишет:
 if (readPower < 1 || readPower > 30) readPower = 16;
 if (writePower < 1 || writePower > 30) writePower = 16;


Такое можно вручную добавить прямо в байткоде, там все крайне просто, даже новых переменных объявлять не придётся.

Если же вы хотите подгружать это откуда-то - значит надо emit юзать, генерировать на лету из подгруженных констант, что уже посложнее.

Добавлено спустя 2 минуты
Nimnul пишет:
с помощью библиотеки mono.cecil

Да, точно, забыл про либы для редактирования сборок упомянуть.

-----
Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску.


| Сообщение посчитали полезным: jangle
 eXeL@B —› Вопросы новичков —› Как добавить в скомпилированную .NET сборку свой код?
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати