2013-08-19 3 views
0

저는이 간단한 코드를 직접 작성하려고 노력했지만 약간 어려웠습니다 (Reflection.Emit는 매우 새로운 것입니다). 그래서 여기 있습니다. 내가 필요로하는 것은 수퍼 클래스에서 상속 받고 메소드를 오버라이드하는 전체 클래스입니다.이 모든 것은 런타임에 생성되고 생성되도록 작성되었습니다.VB> Reflection.Emit : 수퍼 클래스에서 상속 받고 메서드를 재정의하십시오.

내 슈퍼 클래스를 ClassA는 구현 IDispose을 제외한 코드없이 빈 클래스 :

Namespace Basic 
    Public Class ClassA 
     Implements IDisposable 


#Region "IDisposable Support" 
     Private disposedValue As Boolean ' To detect redundant calls 

     ' IDisposable 
     Protected Overridable Sub Dispose(disposing As Boolean) 
      If Not Me.disposedValue Then 

       If disposing Then 


        ' TODO: dispose managed state (managed objects). 
       End If 

       ' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below. 
       ' TODO: set large fields to null. 
      End If 
      Me.disposedValue = True 
     End Sub 

     ' TODO: override Finalize() only if Dispose(ByVal disposing As Boolean) above has code to free unmanaged resources. 
     'Protected Overrides Sub Finalize() 
     ' ' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above. 
     ' Dispose(False) 
     ' MyBase.Finalize() 
     'End Sub 

     ' This code added by Visual Basic to correctly implement the disposable pattern. 
     Public Sub Dispose() Implements IDisposable.Dispose 
      ' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above. 
      Dispose(True) 
      GC.SuppressFinalize(Me) 
     End Sub 
#End Region 

    End Class 

End Namespace 

내 ClassB가 런타임에 생성 될 수있는 것입니다.

Namespace Basic 
    Public Class ClassB 
     Inherits ClassA 

     Protected Overrides Sub Dispose(disposing As Boolean) 
      MyBase.Dispose(disposing) 
     End Sub 

    End Class 
End Namespace 

내가 많이 찾고있다 그리고 나는 즉시 ClassB가를 생성 할 때, 상속 코드를 작성하는 방법을 찾을 수 없습니다 : 그것은 다음과 같아야합니다. 또한, 나는 ClassB가

.method family strict virtual instance void 
     Dispose(bool disposing) cil managed 
{ 
    // Code size  11 (0xb) 
    .maxstack 8 
    IL_0000: nop 
    IL_0001: ldarg.0 
    IL_0002: ldarg.1 
    IL_0003: call  instance void WindowsApplication1.Basic.ClassA::Dispose(bool) 
    IL_0008: nop 
    IL_0009: nop 
    IL_000a: ret 
} // end of method ClassB::Dispose 

사람을위한 연산 코드에 호 세그먼트를 작성하는 방법에 대한 것을 확실하지 않다?

+1

정확히 이해가되지 않습니다. 문제가 정확히 무엇입니까? 실패한 시도 코드를 게시 할 수 있습니까? – svick

답변

0

이것이 내가 간략히 이야기 한 것입니다. 이 클래스는는 IDisposable 원하는 분야

Public Class Super 
     Implements IDisposable 



#Region "IDisposable Support" 
     Private disposedValue As Boolean ' To detect redundant calls 

     ' IDisposable 
     Protected Overridable Sub Dispose(disposing As Boolean) 
      If Not Me.disposedValue Then 

       If disposing Then 
        For Each prop As PropertyInfo In Me.GetType.GetProperties 
         If prop.CanWrite Then 
          prop.SetValue(Me, Nothing, Nothing) 
         End If 
        Next 

        ' TODO: dispose managed state (managed objects). 
       End If 

       ' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below. 
       ' TODO: set large fields to null. 
      End If 
      Me.disposedValue = True 
     End Sub 

     ' TODO: override Finalize() only if Dispose(ByVal disposing As Boolean) above has code to free unmanaged resources. 
     'Protected Overrides Sub Finalize() 
     ' ' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above. 
     ' Dispose(False) 
     ' MyBase.Finalize() 
     'End Sub 

     ' This code added by Visual Basic to correctly implement the disposable pattern. 
     Public Overridable Sub Dispose() Implements IDisposable.Dispose 
      ' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above. 
      Dispose(True) 
      GC.SuppressFinalize(Me) 
     End Sub 
#End Region 

    End Class 

을 ... 그리고이 클래스 빌더 내가 원하는 것을이었다 배치 될 수 클래스를 구축 슈퍼

Public Class ClassCreator 
     Public Shared Function CreateClass() As Object 
      Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US") 
      Thread.CurrentThread.CurrentUICulture = New CultureInfo("en-US") 

      Dim name As String = "DefineMethodOverrideExample" 
      Dim myAssemblyName As New AssemblyName(name) 
      Dim myAssemblyBuilder As AssemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.RunAndSave) 
      Dim myModuleBuilder As ModuleBuilder = myAssemblyBuilder.DefineDynamicModule(name, name & ".dll") 

      Dim myTypebuilder As TypeBuilder = myModuleBuilder.DefineType("C", TypeAttributes.Public, GetType(Super)) 

      Dim myMethodBuilder As MethodBuilder = myTypebuilder.DefineMethod("Dispose", 
                 MethodAttributes.Public Or MethodAttributes.ReuseSlot Or MethodAttributes.Virtual Or MethodAttributes.HideBySig, 
                 Nothing, 
                 Type.EmptyTypes) 
      Dim il As ILGenerator = myMethodBuilder.GetILGenerator() 

      il = myMethodBuilder.GetILGenerator() 
      il.Emit(OpCodes.Nop) 
      il.Emit(OpCodes.Ldarg_0) 
      il.Emit(OpCodes.Call, GetType(Super).GetMethod("Dispose")) 
      il.Emit(OpCodes.Nop) 
      il.Emit(OpCodes.Nop) 
      il.Emit(OpCodes.Ret) 


      Dim tc As Type = myTypebuilder.CreateType() 

      myAssemblyBuilder.Save(name & ".dll") 



      Dim test As Object = Activator.CreateInstance(tc) 
      Return test 

     End Function 
    End Class 

에서 상속 내 수업 빌더입니다 :)