3

次のようなメンバーを持つC#dllがあります。

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

スローオペコードを取得する方法を理解しました:

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'
})

私の質問は、スローオペコードを再スローオペコードに置き換えるにはどうすればよいですか?

4

1 に答える 1

3

ILProcessorメソッドCreateのオペコードを取得しrethrow、プロセッサのメソッドを使用してをReplaceと交換できると思います。throwrethrow

メソッド本体の指示をすぐに取得する代わりに、メソッド本体への参照を取得し、それを使用しmyMethod.Body.GetIlProcessormyMethod.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 に答える