Pregunta

Users are able to launch multiple instances of InMemory assemblies from a main application. The problem is the public variables in the InMemory assemblies seem to overwrite each other. Is there a way to fix this?

I also tried renaming the Namespace Evaluator and Class Evaluator to differently per instance but that did not help.

Namespace Evaluator

    Public Module GlobalSettings
        Public Var1 As String
        Public Var2 As String
        Public TextBox1 As New TextBox
        Public TextBox2 As New TextBox
    End Module

    Public Class Evaluator

        '...insert code here

    End Class

End Namespace

Friend Function CompileCode() As Object
    Dim compResults As CompilerResults
    Dim code = GetCode()

    Dim provOptions As New Dictionary(Of String, String)
    provOptions.Add("CompilerVersion", "v3.5")

    Dim vbProv = New VBCodeProvider(provOptions)

    Dim vbParams = New CompilerParameters()
    vbParams.ReferencedAssemblies.Add("mscorlib.dll")
    vbParams.ReferencedAssemblies.Add("System.dll")
    vbParams.ReferencedAssemblies.Add("System.Windows.Forms.dll")
    vbParams.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll")
    vbParams.ReferencedAssemblies.Add("System.Data.dll")

    vbParams.TreatWarningsAsErrors = False
    vbParams.GenerateExecutable = False
    vbParams.GenerateInMemory = True

    compResults = vbProv.CompileAssemblyFromSource(vbParams, code)

     _evaluator = compResults.CompiledAssembly.CreateInstance("Evaluator.Evaluator")

End Function
¿Fue útil?

Solución

After a lot of trial and testing I found a solution. It had nothing to do with the Public variables and also changing the Namespace and Class name for each instance did not work either, each code assembly was still sharing information back and forth. So the answer... Because the multiple instances were being called from the same parent application the _evaluator Object needs to be independent for each instance in the Compiler code and the Invoking code.

I ended up allowing for 5 instances that could be launched at the same time from a windows application. If one instance is closed then the program assigns the next called instance to the available id which I am storing in a public List(Of...) paired values. that code is not shown here of how to assign and remove.

Dim _evaluator1 As Object
Dim _evaluator2 As Object
Dim _evaluator3 As Object
Dim _evaluator4 As Object
Dim _evaluator5 As Object

Friend Function CompileCode() As Object
   Dim compResults As CompilerResults
   Dim code = GetCode()

   Dim provOptions As New Dictionary(Of String, String)
   provOptions.Add("CompilerVersion", "v3.5")

   Dim vbProv = New VBCodeProvider(provOptions)

   Dim vbParams = New CompilerParameters()
   vbParams.ReferencedAssemblies.Add("mscorlib.dll")
   vbParams.ReferencedAssemblies.Add("System.dll")
   vbParams.ReferencedAssemblies.Add("System.Windows.Forms.dll")
   vbParams.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll")
   vbParams.ReferencedAssemblies.Add("System.Data.dll")

   vbParams.TreatWarningsAsErrors = False
   vbParams.GenerateExecutable = False
   vbParams.GenerateInMemory = True

   compResults = vbProv.CompileAssemblyFromSource(vbParams, code)

     Select Case CurrentInstance
         Case 1 : _evaluator1 = compResults.CompiledAssembly.CreateInstance("Evaluator.Evaluator")
         Case 2 : _evaluator2 = compResults.CompiledAssembly.CreateInstance("Evaluator.Evaluator")
         Case 3 : _evaluator3 = compResults.CompiledAssembly.CreateInstance("Evaluator.Evaluator")
         Case 4 : _evaluator4 = compResults.CompiledAssembly.CreateInstance("Evaluator.Evaluator")
         Case 5 : _evaluator5 = compResults.CompiledAssembly.CreateInstance("Evaluator.Evaluator")
     End Select

End Function

Invoking

  Dim objResult As Object

        Select Case CurrentInstance
            Case 1 : objResult = _evaluator1.GetType.InvokeMember(name, BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.InvokeMethod, Nothing, _evaluator1, args)
            Case 2 : objResult = _evaluator2.GetType.InvokeMember(name, BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.InvokeMethod, Nothing, _evaluator2, args)
            Case 3 : objResult = _evaluator3.GetType.InvokeMember(name, BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.InvokeMethod, Nothing, _evaluator3, args)
            Case 4 : objResult = _evaluator4.GetType.InvokeMember(name, BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.InvokeMethod, Nothing, _evaluator4, args)
            Case 5 : objResult = _evaluator5.GetType.InvokeMember(name, BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.InvokeMethod, Nothing, _evaluator5, args)
        End Select
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top