使用 Mono.Cecil 和 PCL 代码注入锁定目标程序集

Locked Target Assembly with Mono.Cecil and 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 事件复制到临时目录上得到解决。

构建包含 Target 程序集并使用 Mono.Cecil 的 TargetSolution 我能够读取 Target.dll 修改类型并插入 IL 指令但是当我尝试使用 Mono.Cecil.AssemblyDefinyion.Write() 我总是从 MSBuild

收到错误

该进程无法访问 Target.dll,因为它正被另一个进程使用。我假设是 MSBuild 本身。

有关如何使用 Mono.Ceeil 和 PCL 编织目标程序集的任何指示,该程序集正在使用自定义 MSBuild AfterBuild 目标构建。

好的,我向 Jb Evain 问了这个问题,根据他的评论,我将回答我自己的问题。

这是由于最新版本的 Cecil (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
}