How to create a usercontrol and its codebehind from source file(s) at runtime and load into a panel? I'm pretty sure using CodeDom could solve this, but not quite sure how to go about it. Can anyone provide a simplified example for this? Thanks in advance.
SAMPLE of script to complile
Option Infer On
Imports System
Imports System.Data
Imports System.Math
Imports System.Web.UI.WebControls
Imports System.Web.UI
Imports System.Web.UI.HtmlControls
Namespace Evaluator
Public Class Evaluator
Dim Project As New UserControl
Dim Panel1 As New Panel
Dim WithEvents Button1 As New Button
Dim WithEvents TextBox1 As New TextBox
Public Function GetProject(ByVal ParamArray expr() As Object) As UserControl
'panel 1
Panel1.Style.Add("background-color", "#D9E0E8")
Panel1.Style.Add("padding-top", "5px")
Panel1.Style.Add("margin-top", "5px")
Panel1.Style.Add("width", "490px")
Panel1.Style.Add("height", "30px")
Project.Controls.Add(Panel1)
'button 1
Button1.ID = "Button1"
Button1.Text = "Add"
Button1.Width = 100
AddHandler Button1.Click, AddressOf Button1_Click
Panel1.Controls.Add(Button1)
'textbox 1
TextBox1.ID = "TextBox1"
TextBox1.Width = 200
TextBox1.Text = 0
Panel1.Controls.Add(TextBox1)
Return Project
End Function
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
TextBox1.Text += 1
End Sub
End Class
End Namespace
SAMPLE web page (Code Behind) to compile it
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim filePath = Server.MapPath("script.vb")
Dim provider = VBCodeProvider.CreateProvider("VisualBasic")
Dim opts = New CompilerParameters({"mscorlib.dll", "System.dll", "System.Web.dll", "Microsoft.VisualBasic.dll", "System.Data.dll", "System.Xml.dll", "System.Data.Linq.dll", "System.Core.dll", "System.Drawing.dll", "System.Web.Extensions.dll", "System.Data.DataSetExtensions.dll"})
opts.CompilerOptions = "/t:library"
opts.TreatWarningsAsErrors = False
opts.GenerateExecutable = False
opts.GenerateInMemory = True
Dim cr = provider.CompileAssemblyFromFile(opts, New String() {filePath})
'Check for compile errors
If cr.Errors.Count > 0 Then
HttpContext.Current.Session("_evaluator") = Nothing
For Each err As CompilerError In cr.Errors
Debug.Print(err.ErrorText, err.Line)
Next
Else
'Create the Assembly and store in memory
Dim evaluator As Object = Nothing
evaluator = cr.CompiledAssembly.CreateInstance("Evaluator.Evaluator")
HttpContext.Current.Session("_evaluator") = evaluator
HttpContext.Current.Session("MyAssembly") = cr.CompiledAssembly.FullName
End If
Panel1.Controls.Clear()
Call Evaluate()
End Sub
Public Sub Evaluate()
Try
'Invoke method
Dim Evaluator As Object = CType(HttpContext.Current.Session("_evaluator"), Object)
Dim objResult As Object = Evaluator.GetType.InvokeMember("GetProject", BindingFlags.InvokeMethod + Reflection.BindingFlags.Default, Nothing, Evaluator, Nothing)
If Not objResult Is Nothing Then
Panel1.Controls.Add(objResult)
End If
Catch ex As Exception
Debug.Print(ex.Message)
End Try
End Sub