2012-09-13 30 views
2

我想從MethodReference生成委託類型,但PEVerify一直說我的類型無效。如何從方法引用生成委託類型?

這裏是我的代碼:

 TypeDefinition CreateDelegates(TypeDefinition type, MethodReference source) { 
      var desiredname = source.Name.ToLowerInvariant() + "__DELEGATE"; 
      var module = type.Module; 

      if (type.HasNestedTypes) { 
       foreach (var deleg in type.NestedTypes) { 
        if (deleg.Name == desiredname) return deleg; 
       } 
      } 

      var multiDelegateType = module.Import(typeof(MulticastDelegate)); 
      var voidType = module.Import(typeof(void)); 
      var objectType = module.Import(typeof(object)); 
      var nativeIntType = module.Import(typeof(IntPtr)); 
      var asyncCallbackType = module.Import(typeof(AsyncCallback)); 
      var asyncResultType = module.Import(typeof(IAsyncResult)); 

      // Create new delegate type 
      var dlgtype = new TypeDefinition("", desiredname, TypeAttributes.Sealed | TypeAttributes.NestedAssembly, multiDelegateType); 
      type.NestedTypes.Add(dlgtype); 

      var constructor = new MethodDefinition(".ctor", MethodAttributes.Public | MethodAttributes.CompilerControlled | MethodAttributes.RTSpecialName | MethodAttributes.SpecialName | MethodAttributes.HideBySig, voidType); 

      constructor.IsRuntime = true; 
      constructor.HasThis = true; 
      constructor.IsHideBySig = true; 
      //constructor.IsVirtual = true; 
      constructor.IsPublic = true; 

      constructor.Parameters.Add(new ParameterDefinition("'object'", ParameterAttributes.None, objectType)); 
      constructor.Parameters.Add(new ParameterDefinition("'method'", ParameterAttributes.None, nativeIntType)); 
      dlgtype.Methods.Add(constructor); 

      var begininvoke = new MethodDefinition("BeginInvoke", MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual, asyncResultType); 
      begininvoke.IsRuntime = true; 
      begininvoke.HasThis = true; 
      begininvoke.IsHideBySig = true; 
      begininvoke.IsRuntimeSpecialName = true; 
      begininvoke.IsSpecialName = true; 
      begininvoke.IsPublic = true; 
      begininvoke.IsVirtual = true; 

      foreach (var para in source.Parameters) { 
       begininvoke.Parameters.Add(new ParameterDefinition(para.Name, para.Attributes, para.ParameterType)); 
      } 

      begininvoke.Parameters.Add(new ParameterDefinition("callback", ParameterAttributes.None, asyncCallbackType)); 
      begininvoke.Parameters.Add(new ParameterDefinition("object", ParameterAttributes.None, objectType)); 

      dlgtype.Methods.Add(begininvoke); 

      var endinvoke = new MethodDefinition("EndInvoke", MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual, voidType); 
      endinvoke.Parameters.Add(new ParameterDefinition("result", ParameterAttributes.None, asyncResultType)); 

      endinvoke.IsRuntime = true; 
      endinvoke.HasThis = true; 
      endinvoke.IsHideBySig = true; 
      endinvoke.IsRuntimeSpecialName = true; 
      endinvoke.IsSpecialName = true; 
      endinvoke.IsPublic = true; 

      dlgtype.Methods.Add(endinvoke); 

      var invoke = new MethodDefinition("Invoke", MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual, voidType); 

      foreach (var para in source.Parameters) { 
       invoke.Parameters.Add(new ParameterDefinition(para.Name, para.Attributes, para.ParameterType)); 
      } 

      invoke.IsRuntime = true; 
      invoke.HasThis = true; 
      invoke.IsHideBySig = true; 
      invoke.IsVirtual = true; 
      invoke.IsPublic = true; 

      dlgtype.Methods.Add(invoke); 

      return dlgtype; 

     } 

而在peverify我得到:

[token 0x02000008] Type load failed. 
[token 0x02000009] Type load failed. 
[token 0x0200000A] Type load failed. 
[token 0x0200000B] Type load failed. 

哪些是代表。

回答

相關問題