2013-07-23 4 views
0

사용자는 주 응용 프로그램에서 여러 개의 InMemory 어셈블리 인스턴스를 시작할 수 있습니다. 문제는 InMemory 어셈블리의 공용 변수가 서로 덮어 쓰는 것입니다. 이 문제를 해결할 수있는 방법이 있습니까?CodeDom에서 생성 된 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 

답변

0

많은 시험과 테스트를 거친 끝에 해결책을 찾았습니다. 공개 변수와는 아무런 관련이 없으며 각 인스턴스의 네임 스페이스와 클래스 이름을 변경해도 작동하지 않았으며 각 코드 어셈블리는 정보를 앞뒤로 공유하고있었습니다. 그래서 대답은 ... 동일한 부모 응용 프로그램에서 여러 인스턴스가 호출 되었기 때문에 _evaluator 객체는 컴파일러 코드와 호출 코드의 각 인스턴스에 대해 독립적이어야합니다.

나는 창 응용 프로그램에서 동시에 시작할 수있는 5 개의 인스턴스를 허용했습니다. 하나의 인스턴스가 닫히면 프로그램은 다음에 호출 한 인스턴스를 공용 목록 (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