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