Click here to Skip to main content
15,887,683 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi,
I am trying to bind an eventHandler to an event raised from an in-memory compiled source code. Below is the detail
C#
//======================
// Name of the saved file ABC.cs

using CustomDll; // <- A compiled library containg Events and Some functions

class ABC
{
//ReadOnlyEventArgs defined in CustomDll

   public event EventHandler<readonlyeventargs><int>> OnSubscription;
   public  event EventHandler<readonlyeventargs><int>> OnUnSubscription;

   int CMETOKEN = 178569; // Can be anything Say Electronic Tradable token of Silver

   private void Subscribe(int Token)
   {
      OnSubscription.Raise(OnSubscription, OnSubscription.CreateReadOnlyArgs(Token));
   }
   private void UnSubscribe(int Token)
   {
      OnUnSubscription.Raise(OnUnSubscription, OnUnSubscription.CreateReadOnlyArgs(Token));
   }

   ABC()
   {
      Subscribe(CMETOKEN); 
   }
   ~ABC()
   {
      UnSubscribe(CMETOKEN);
   }

   //other methods and functions defined here ....

}
//======================


Note : This class compiles without any error

Now the rule to run as automated Trade System is ready.

I use CodeDomProvider to compile this code in memory and then need to connect the events. Here I am facing the real problem. I am unable to bind any of
the above event with an event handler in the form where the code is compiled.

Form1.vb
VB
'Note : There is no logic of using vb here as i had this compiler written earlier so thought to use it with some changes.
 
Public Sub OnDataArrived(ByVal o As Object, ByVal Stat As ReadOnlyEventArgs(Of Integer)) ' I want the event raised from ABC.dll to be handled here

End Sub
 
'inside button click event
Dim Provider As CodeDomProvider = Nothing

Provider = CodeDomProvider.CreateProvider("CSharp")

Dim CVB As System.CodeDom.Compiler.ICodeCompiler
CVB = Provider.CreateCompiler
Dim PM As New System.CodeDom.Compiler.CompilerParameters
PM.GenerateInMemory = True
               
PM.OutputAssembly = "ABC.dll"

PM.MainClass = "ABC"

PM.IncludeDebugInformation = True

If CounterValue <= 0 Then
   Dim ASM As System.Reflection.Assembly
   For Each ASM In AppDomain.CurrentDomain.GetAssemblies()
      PM.ReferencedAssemblies.Add(ASM.Location)
   Next
End If

PM.ReferencedAssemblies.Add(Application.StartupPath + Path.DirectorySeparatorChar + "CustomDll.dll")

'Get compilation results
Dim Results As System.CodeDom.Compiler.CompilerResults
Results = CVB.CompileAssemblyFromSource(PM, tbcode.Text)

'Show possible compilation errors
Dim Err As System.CodeDom.Compiler.CompilerError
For Each Err In Results.Errors
   ListBox1.Items.Add("Error N. " & Err.ErrorNumber & " Message: " & Err.ErrorText & " Line " & Err.Line)
Next

'Use the compiled assembly
If (ListBox1.Items.Count = 0) Then
   RunObj = New Object

   RunObj = Results.CompiledAssembly.CreateInstance(
      "OrderStg", False,
      Reflection.BindingFlags.CreateInstance, Nothing,
      {}, Nothing, Nothing)


   Dim members As MemberInfo() = RunObj.GetType().GetMembers(BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.Static)

   indent += 1

   For Each M As MemberInfo In members
      If (M.MemberType = MemberTypes.Method) Then
         For Each pi As ParameterInfo In (CType(M, MethodInfo)).GetParameters()
            Display(indent + 1, "Parameter: Type={0}, Name={1}", pi.ParameterType, pi.Name)
         Next pi
      End If

      If (M.MemberType = MemberTypes.Event) Then
         Dim Evnt As EventInfo = CType(M, EventInfo)
                           
         If (Evnt.Name = "OnSubscription") Then
            Dim events As Type = Evnt.EventHandlerType  'Gets desired Value here
            Dim InvokeMethod As MethodInfo = events.GetMethod("Invoke")'Gets desired Value here
            Dim Param() As ParameterInfo = InvokeMethod.GetParameters()'Gets desired Value here
								
								
            messageTarget = Function(i As Integer) OnDataArrived(i) 'Trial 1 : Error	2	Argument not specified for parameter 'Stat' of 'Public Sub OnDataArrived(o As Object, Stat As AutoTrader.ReadOnlyEventArgs(Of Integer))'.

            Dim D As [Delegate] = [Delegate].CreateDelegate(events, OnDataArrived) 'Trial 2 : Error	3	Argument not specified for parameter ........


            'Evnt.AddEventHandler(Evnt, D)

         End If
      End If
   Next
End If  'button click event ends



Please help me out..
Updated 4-Jun-14 2:02am
v4

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900