2013-03-01 11 views
9

Artykuły przeczytane na T4 przy użyciu TextTemplatingFilePreprocessor pokazują, jak dynamicznie generować kod, który staje się częścią projektu i jest kompilowany z projektem.Kompilowanie kodu dynamicznego w czasie wykonywania za pomocą T4 i C#

Czy można użyć T4 do wygenerowania kodu, który jest kompilowany w czasie wykonywania, wysyłany do biblioteki dll, a następnie ładowany i wykonywany, a wspomniany kod ma dostęp do zwykłych możliwości widoczności związanych z biblioteką dll?

Jeśli tak, czy mógłbyś wskazać mi przykład.

Próbuję skutecznie zrobić to samo, co generowanie dynamicznego biblioteki dll za pomocą IL, ale raczej za pomocą C#.

EDIT

Szczególny przypadek muszę za to jest proste. Piszę router wiadomości, który kieruje wiadomości do usług. Usługi mogą być lokalne lub zdalne. Deklaracyjny skrypt jest kompilowany do C#. Część dynamiczna to "czy ta usługa jest lokalna czy zdalna?". Wyjście C# zostanie odpowiednio zmienione. Styl routingu jest różny dla lokalnych/zdalnych, stąd dynamiczny charakter.

To jest jeden z przykładów tego, czego potrzebuję.

+0

Nie jestem pewien, trzeba generowanie kodu do tego. Nie możesz mieć dwóch typów: jeden dla usług lokalnych i jeden dla zdalnego i wybrać w czasie wykonywania, którego użyć? – svick

+0

Oczywiście, nawet prosta instrukcja if, która łączy właściwego delegata. Używam tego jako prostego przykładu * a * przypadku, w którym korzystny byłby dynamiczny. Mam bardziej złożone przypadki, których jeszcze nie w pełni zmapowałem. – IamIC

Odpowiedz

4

Aby to zrobić, trzeba wiedzieć dwie rzeczy:

  1. Można użyć szablonu wykonawczego T4 wygenerować jakiś tekst w czasie wykonywania, w tym C# kodu źródłowego.
  2. Można użyć CSharpCodeProvider, aby skompilować złożenie z tekstu w środowisku wykonawczym. Lub możesz ręcznie uruchomić csc.exe (kompilator C# w wierszu poleceń) na wygenerowanym tekście, ale to byłoby bardziej skomplikowane. (Faktycznie CSharpCodeProvider robi dokładnie to, że za kulisami.)

Kod mógłby wyglądać następująco:

var template = new RuntimeTextTemplate(); 
string code = template.TransformText(); 

var compiler = new CSharpCodeProvider(); 
var result = compiler.CompileAssemblyFromSource(
    new CompilerParameters { OutputAssembly = "assembly.dll" }, code); 
+0

czy możesz wskazać mi coś, co pokazuje, w jaki sposób T4 może oceniać dane w czasie wykonywania (naturalnie dane, które określają wyjście). – IamIC

+1

@IanC Jeśli utworzysz szablon wykonawczy, zostanie on oceniony w czasie wykonywania (tak jak w moim przykładzie kodu). Aby zmodyfikować dane wejściowe szablonu, można na przykład użyć właściwości w "Blokach kontroli cech klasowych", do których można uzyskać dostęp z szablonu. – svick

+0

Jest ładny post z @ ode2code http://odetocode.com/blogs/scott/archive/2011/01/04/preprocessed-t4-templates.aspx, który pokazuje, jak dodać proste dane w klasie częściowej, która jest techniką bardzo podobną do szablonów uruchomieniowych. – GarethJ

Powiązane problemy