复制2个或多个DLL之间的汇编代码



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

相关内容

  • 没有找到相关文章

最新更新