使用 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
}
我的解决方案结构如下:
**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
}