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
DennisW Geschrieben 25. Oktober 2007 Autor Geschrieben 25. Oktober 2007 Fehler gefunden! Es fehlte die Referenz auf System.Windows.Forms.dll :oldcp.ReferencedAssemblies.Add("system.windows.forms.dll")
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...
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden