DennisW Geschrieben 25. Oktober 2007 Geschrieben 25. Oktober 2007 Hi zusammen, meine Klasse beinhaltet eine Funktion, die mir ein beliebiges Control zurückgeben soll. Sprich wenn ich als Parameter "System.Windows.Forms.Button" übergeben, möchte ich eine Instanz dieses Controls zurück bekommen. Ich habe hier meinen bisherigen Code mal angehängt, denn in der Zeile "Assembly = CompilerResults.CompiledAssembly" bekomme ich einen Fehler. Könnt ihr mir da ggf. weiterhelfen? Danke schonmal im voraus, Gruß Dennis. Imports System Imports System.Text Imports System.CodeDom.Compiler Imports System.Reflection Public Class Form1 Private Sub btn_EvalTwo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_EvalTwo.Click Me.Controls.Add(Eval("System.Windows.Forms.Button")) End Sub Public Function Eval(ByVal vbCode As String) As Object Dim Assembly As System.Reflection.Assembly Dim CompilerResults As CompilerResults Dim CompilerParameters As CompilerParameters = New CompilerParameters() Dim MethodInfo As MethodInfo Dim s As Object Dim StringBuilder As StringBuilder = New StringBuilder("") Dim TmpObject As Object Dim TmpType As Type Dim VBCodeProvider As VBCodeProvider = New VBCodeProvider Dim ICodeCompiler As ICodeCompiler = VBCodeProvider.CreateCompiler() CompilerParameters.ReferencedAssemblies.Add("system.dll") CompilerParameters.ReferencedAssemblies.Add("system.xml.dll") CompilerParameters.ReferencedAssemblies.Add("system.data.dll") CompilerParameters.CompilerOptions = "/t:library" CompilerParameters.GenerateInMemory = True StringBuilder.Append("Imports System " & vbCrLf) StringBuilder.Append("Imports System.Xml " & vbCrLf) StringBuilder.Append("Imports System.Data " & vbCrLf) StringBuilder.Append("Imports System.Data.SqlClient " & vbCrLf) StringBuilder.Append("Namespace PAB " & vbCrLf) StringBuilder.Append("Class PABLib " & vbCrLf) StringBuilder.Append("Public Function EvalCode() As Object " & vbCrLf) StringBuilder.Append("Dim Temp As New " & vbCode & vbCrLf) StringBuilder.Append("Return Temp " & vbCrLf) StringBuilder.Append("End Function " & vbCrLf) StringBuilder.Append("End Class " & vbCrLf) StringBuilder.Append("End Namespace " & vbCrLf) Debug.WriteLine(StringBuilder.ToString()) CompilerResults = ICodeCompiler.CompileAssemblyFromSource(CompilerParameters, StringBuilder.ToString()) Assembly = CompilerResults.CompiledAssembly 'In dieser Zeile tritt der Fehler auf! TmpObject = Assembly.CreateInstance("PAB.PABLib") TmpType = TmpObject.GetType() MethodInfo = TmpType.GetMethod("EvalCode") s = MethodInfo.Invoke(TmpObject, Nothing) Return s End Function End Class Zitieren
DennisW Geschrieben 25. Oktober 2007 Autor Geschrieben 25. Oktober 2007 Fehler gefunden! Es fehlte die Referenz auf System.Windows.Forms.dll :old cp.ReferencedAssemblies.Add("system.windows.forms.dll") Zitieren
Trux Geschrieben 25. Oktober 2007 Geschrieben 25. Oktober 2007 Ich finde deine Lösung einwenig überladen... Warum machst du nicht einfach Control ctrl = null; Type tControl = null; foreach (Assembly assemlby in AppDomain.CurrentDomain.GetAssemblies()) { tControl = assemlby.GetType("System.Windows.Forms.Button", false, true); if (tControl != null) break; } if (typeof(Control).IsAssignableFrom(tControl)) { ConstructorInfo constructor = tControl.GetConstructor(new Type[0]); ctrl = constructor.Invoke(new object[0]) as Control; } else { throw new InvalidOperationException(tControl.FullName + " is not a Control"); } ... ist viel perfomanter, weil nicht jedesmal eine Assembly genriert wird... Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.