System.Linq.Expressions名前空間のクラスを使って式木(expression tree, 式ツリーとも)を作成することによっても実行可能なコードを動的に生成することができます。 .NET Framework 4以降では、式だけでなく条件分岐やループなどのブロック構文も扱うことができるようになっています。 式木では生成したコードをデリゲートに変換(コンパイル)し、任意に呼び出すことができます。

System.Linq.Expressions名前空間のクラスを使って単純な式木を構築して呼び出す
Option Infer On

Imports System
Imports System.Linq.Expressions

Class Sample
  Shared Sub Main()
    ' 以下のラムダ式と同様の式木を生成する
    'Dim a As Action(Of String) = Sub(s) Console.WriteLine(s.ToUpper())

    ' 式木に渡されるパラメータ(string型)
    Dim s = Expression.Parameter(GetType(String), "s")

    ' Console.WriteLine(param.ToUpper())に相当する式木を生成する
    Dim printUpperCase = Expression.Call(
      GetType(Console).GetMethod("WriteLine", New Type() {GetType(String)}),
      Expression.Call(s, GetType(String).GetMethod("ToUpper", Type.EmptyTypes))
    )

    ' 式木を構成してラムダ式に変換する
    Dim lambda = Expression.Lambda(Of Action(Of String))(printUpperCase, New ParameterExpression() {s})

    ' デリゲートに変換する
    Dim a = lambda.Compile()

    ' 変換したデリゲートに引数を渡して呼び出す
    a("Hello, world!")
  End Sub
End Class
実行結果
Hello, world!