0

ユーザーは、メイン アプリケーションから InMemory アセンブリの複数のインスタンスを起動できます。問題は、InMemory アセンブリのパブリック変数が互いに上書きしているように見えることです。これを修正する方法はありますか?

また、名前空間エバリュエーターとクラス エバリュエーターの名前をインスタンスごとに異なる名前に変更しようとしましたが、それは役に立ちませんでした。

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
4

1 に答える 1

0

多くの試行錯誤の後、私は解決策を見つけました。パブリック変数とは何の関係もありませんでした。また、各インスタンスの名前空間とクラス名を変更しても機能しませんでした。各コード アセンブリは依然として情報をやり取りしていました。答えは... 複数のインスタンスが同じ親アプリケーションから呼び出されていたため、_evaluator オブジェクトは、コンパイラ コードと呼び出しコードの各インスタンスに対して独立している必要があります。

Windowsアプリケーションから同時に起動できる5つのインスタンスを許可することになりました。1 つのインスタンスが閉じられている場合、プログラムは次に呼び出されたインスタンスを、パブリック List(Of...) ペア値に格納している使用可能な ID に割り当てます。そのコードは、割り当てと削除の方法についてここには示されていません。

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

呼び出し中

  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
于 2013-07-25T15:47:47.447 に答える