首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在两个或更多dll之间复制程序集代码

在两个或更多dll之间复制程序集代码
EN

Stack Overflow用户
提问于 2019-02-22 10:29:06
回答 1查看 163关注 0票数 0

我在大会上有ByteCode。我想将该守则复制到另一个大会。这不是一件容易的事,但乍一看我得到了一份好的副本。我可以复制名称空间、类、自定义属性、字段等等。但我对Bodys的方法有个问题。

我知道我可以通过:

代码语言:javascript
复制
byte[] ilCode = method.GetMethodBody().GetILAsByteArray();

此外,我知道如何设置新的方法主体:

代码语言:javascript
复制
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 //原始方法
  • param :列表//参数类型列表
  • exec :列出//列出所有例外条款
  • 西格: SignatureHelper //不太确定,但与当地人有些关系。

现在我有了以下结果:

第一,最初的方法:

代码语言:javascript
复制
 .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

现在,我在另一边得到的是:

代码语言:javascript
复制
.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方法定义为:

代码语言:javascript
复制
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“的信息。

这些补丁是什么?我怎么弄到它们?或者可能是在别的地方?

编辑:似乎只有函数调用无效。如果我能从它的Byte表示中识别函数,我就可以修复它。

EN

回答 1

Stack Overflow用户

发布于 2019-02-22 18:05:45

您应该使用现有的工具,如https://github.com/dotnet/ILMergehttps://github.com/gluck/il-repack,这些工具允许您将dll和exe组合到一个文件中。

至于两次加载同一个类,如果程序集已经加载到应用程序域中,那么即使程序集版本不同,它也不会加载两次(我相信)。所以我不认为这是个问题。

参见加载重复程序集:https://social.msdn.microsoft.com/Forums/vstudio/en-US/9748a274-0925-48a1-8dc7-3214ffe55ff9/prevent-duplicate-dll-from-loading-twice-ccli?forum=netfxbcl

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54825043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档