3

我有一个 C# dll,其成员类似于以下内容:

public void DoStuff(int i) {
    try {
        something.InnerDoStuff(i);
    }
    catch (Exception ex) {
        throw ex;
    }
}

我想出了如何获得throw 操作码

Add-Type -Path 'c:\Program Files\ILSpy2\Mono.Cecil.dll'
Add-Type -Path 'c:\Program Files\ILSpy2\Mono.Cecil.pdb.dll'

$dll = 'c:\Program Files\ZippySoft\Something\foo.dll'
$assemblyDefinition = [Mono.Cecil.AssemblyDefinition]::ReadAssembly($dll);

$doThingsIlAsm = (
    (
        $assemblyDefinition.MainModule.Types `
            | where { $_.Name -eq 'DoerOfThings' } `
            | select -first 1 *
    ).Methods | where { $_.Name -eq 'DoStuff' }
).Body.Instructions 

$throwOp = ($doThingsIlAsm | where {
    $_.OpCode.Name -eq 'throw'
})

我的问题是如何将 throw opcode 替换为rethrow opcode

4

1 回答 1

3

我相信你可以得到一个ILProcessorfor 你的方法,Create一个rethrow操作码,然后使用处理器的Replace方法来交换throwfor a rethrow

不要立即获取方法主体的说明,而是获取对方法主体的引用并使用它来获取myMethod.Body.GetIlProcessor以及myMethod.Body.Instructions. 然后你可以找到你已经存在的 throw 指令,并使用 Replace 方法将它们换出。

这是未经测试的,但我认为它的要点是:

$throw = # your existing stuff
$il = myMethod.Body.GetIlProcessor()
$rethrow = $il.Create(OpCodes.Rethrow) # not sure about the powershell syntax for enums
$il.Replace($throw, $rethrow)
于 2012-08-23T21:03:50.973 回答