i在一个汇编中具有字节码。我想将此代码复制到另一个组件。这并不容易,但乍一看我得到了很好的副本。我可以复制名称空间,类,自定义属性,字段等。但是我对方法的身体有问题。
我知道我可以使用:
获得代码byte[] ilCode = method.GetMethodBody().GetILAsByteArray();
我知道如何设置新方法主体:
MethodBuilder methodBuilder = typeBuilder.DefineMethod(method.Name, method.Attributes, method.CallingConvention, method.ReturnType, param.ToArray());
methodBuilder.SetMethodBody(ilCode, method.GetMethodBody().MaxStackSize, sig.GetSignature(), exce, null);
变量定义如下:
- 方法:MethodInfo//原始方法
- 参数:列表//参数型列表
- exec:list//所有异常条款的列表
- sig:signaturehelper//不确定,但是当地人的东西
现在我有以下结果:
首先是原始方法:
.method private hidebysig instance void onTargetFloorReached() cil managed
{
// Code size 12 (0xc)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldstr "TargetFloorReached"
IL_0006: call instance void ['Assembly-CSharp']BaseWeb::CallFunctionWithParameter(string)
IL_000b: ret
} // end of method Lift::onTargetFloorReached
现在,我在另一侧得到的东西:
.method private hidebysig instance void onTargetFloorReached() cil managed
{
// Code size 12 (0xc)
.maxstack 8
IL_0000: ldarg.0
INVALID TOKEN: 0x70000001
IL_0006: call [ERROR: INVALID TOKEN 0x0A00000D]
IL_000b: ret
} // end of method Lift::onTargetFloorReached
我尝试加载原始DLL的每个依赖性,但不会更改任何内容。
setMethodbody方法定义为:
public void SetMethodBody (byte[] il, int maxStack, byte[] localSignature, System.Collections.Generic.IEnumerable<System.Reflection.Emit.ExceptionHandler> exceptionHandlers, System.Collections.Generic.IEnumerable<int> tokenFixups);
没有有关" TokenFixups"的信息。
这些修复程序是什么?我怎么能得到他们?还是错误的地方可以在其他地方?
编辑: 似乎只有函数调用无效。 如果我可以从其字节表示中识别函数,我可以解决此问题。
您应该使用现有工具,例如https://github.com/dotnet/ilmerge或https://github.com/gluck.com/gluck/il-repack,允许您组合dlls和exe进入一个文件。
对于加载同一类两次,如果程序集已在应用程序域中加载,即使汇编版本以某种方式不同(我相信),也不会加载两次。所以我看不出这是一个问题。
-ccli?forum = netfxbcl