0

У меня есть структура раствора следующим образом:Закрытая Target ассамблею с Mono.Cecil и PCL Code Injection

**CoreSolution** 
| 
+---- Core.dll (PCL) 
     | 
     +---- CodeInjectionLogic (Inserts IL instruction on each type using Mono.Cecil for PCL) 

**BuildSolution** 
| 
+---- Core.dll (For Project Reference) 
|  
+---- CustomMSBuildTask.dll (Injects the code into the target.dll) 
     | 
     + ---CodeInjectionTask 
      Applies CodeInjectionLogic on each Type to weave IL instruction 

**TargetSolution** 
| 
+---- Core.dll (For Project Reference) 
| 
+---- Target.dll (PCL) 
     | 
     + <using Task CodeInjectionTask....> 

Вопрос блокировки для CustomMSBuildTask.dll решается путем копирования всех библиотек DLL на временного управляющего, как событие BeforeBuild ,

Building TargetSolution, который содержит сборку Target и использование Mono.Cecil. Я могу прочитать файл Target.dll, чтобы изменить типы и вставить инструкцию IL, но когда я попытаюсь записать измененный поток обратно с помощью Mono.Cecil.AssemblyDefiniyion. Write() Я всегда получаю сообщение об ошибке от MSBuild

Процесс не может получить доступ к Target.dll, потому что он используется другим процессом. Я предполагаю, что это сам MSBuild.

Любые указатели на то, как я могу использовать Mono.Ceeil и PCL, чтобы сплести сборку целей, которая строится с использованием настраиваемой цели MSBuild AfterBuild.

ответ

1

Хорошо, я спросил об этом Jb Evain и основываясь на его комментариях, я собираюсь ответить на собственный вопрос.

Это связано с разрывной изменения в последней версии Сесила (0,10 Beta) http://cecil.pe/post/149243207656/mono-cecil-010-beta-1

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

// ReaderParameters { ReadWrite = true } is necessary to later write the file 
using (var module = ModuleDefinition.ReadModule(file, new ReaderParameters { ReadWrite = true })) 
{ 
    // Modify the assembly 
    module.Write(); // Write to the same file that was used to open the file 
} 
Смежные вопросы