Laden...

CodeDom Klasse nutzen, ohne Eingabe-Quellcode per StringBuilder zu erstellen

Erstellt von xorkind vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.474 Views
Thema geschlossen
X
xorkind Themenstarter:in
4 Beiträge seit 2014
vor 9 Jahren
CodeDom Klasse nutzen, ohne Eingabe-Quellcode per StringBuilder zu erstellen

Guten Abend,

Ich bin gerade dabei mich in der CodeDom-Klasse einzulesen, um später zur Laufzeit eine .exe zu compilern.
Bei den meisten Online-Tutorials wird dabei auf den Stringbuilder-Klasse gesetzt. Also z.B. so:


StringBuilder Temp = new StringBuilder();
Temp.Append("@using System;");
...

...aber es ist/wäre viel zu aufwendig ein ganzes Programm so zu schreiben.
Gibt es da nicht noch eine andere Alternative?

16.807 Beiträge seit 2008
vor 9 Jahren

Man kann immer nur gewisse Sachen automatisieren oder Schemen, bevor es uneffizient wird.
Wenn man eine ganze Anwendung automatisiert erstellen könnte oder dies effizient wär, wären unsere Jobs weg.

S
417 Beiträge seit 2008
vor 9 Jahren

Ich weiss nicht was du genau vor hast, aber du kannst den sourcecode dank "@" auch in einen string packen:

string sourceCode = @"using System;

public class Test
{
 // do some magic here
}";

1.346 Beiträge seit 2008
vor 9 Jahren

Du könntest das vielleicht etwas netter mit dem neuen Roslyn Compiler machen und damit Code generieren

X
xorkind Themenstarter:in
4 Beiträge seit 2014
vor 9 Jahren

Entschuldigung für die späte Reaktion.

Im Prinzip muss, wie gesagt, nur eine Codezeile geändert werden, in der eine IP steht.

16.807 Beiträge seit 2008
vor 9 Jahren

Sowas wie eine IP sollte gar nicht fest im Code stehen sondern extern konfigurierbar (zB XML) sein.

Gelöschter Account
vor 9 Jahren

Das CodeDom Modell gibt es auch her, ein komplettes Programm per Definition über das Objekt Modell zu erstellen.

Für ein exemplarisches "using System.Data;" sieht das dann so aus:

CodeCompileUnit unit = new CodeCompileUnit();
CodeNamespace space = new CodeNamespace("MyProjectSpace");
unit.Namespaces.Add(space);
space.Imports.Add(new CodeNamespaceImport("System.Data"));

Die Dokumentation zu dieser API ist leider recht spärlich, mir wurde mal gesagt das Microsoft die volle Doku nur zertifizierten Partner Unternehmen auf Anfrage zugänglich macht. Wenn das stimmt, ist es nicht verwunderlich das die öffentlichen Beispiele eher auf String Schnipseleien setzen. (In einem MSDN Blog Post habe ich gelesen, das Microsoft diese Schnitstelle bisher nicht weiter gepusht hat weil einfach nie ein Grosskunde danach gefragt hat.)

Wesentlich aufwendiger ist das Verfahren mit dem String Builder aber nicht, bestenfalls etwas langsamer und weniger flexibel. Ein eigener Wrapper ist auch schnell gebaut.

4.221 Beiträge seit 2005
vor 9 Jahren

Mit ein wenig Übung schreibt ist es mit der aktuellen Dokumentation ohne weiteres möglich fast alles zu generieren (wobei man nicht alles generieren kann... aber mit Umwegen ist es doch möglich). In meinem Job generiere ich jedenfalls jedenfalls ganze typisierte Proxies.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

X
xorkind Themenstarter:in
4 Beiträge seit 2014
vor 9 Jahren

Naja mein Problem ist, das ich nicht ein ganzes Programm, dass evtl. mehrere 100-Zeilen Code umfasst, später die ganze Zeit in den Stringbuilder zu schreiben.

Das funktoniert zwar, sieht aber unschön aus.

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo xorkind,

hier wurden dir bereits zwei Alternativen aufgezeigt:* per mehrzeiligem String mittels @ davor (siehe Sarc) oder

  • mit den Klassen und Methoden aus dem CodDom-Namespace (siehe Sebastian.Lange).

Allerdings ist es eh nicht der richtige Weg, CodeDom zu benutzen, wenn es nur darum geht, eine IP-Adresse auszutauschen.

herbivore

4.221 Beiträge seit 2005
vor 9 Jahren

Naja mein Problem ist, das ich nicht ein ganzes Programm, dass evtl. mehrere 100-Zeilen Code umfasst, später die ganze Zeit in den Stringbuilder zu schreiben.

Lol ein paar hundert Zeilen ...Ich arbeite gerade an einer App in welcher 41000 Zeilen Code generiert sind... (und das ist nicht die grösste App).

CodeDom hat den Vorteil, dass Du Code in verschiedenen Sprachen generieren kannst (z.B: C# / VB / C)

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

X
xorkind Themenstarter:in
4 Beiträge seit 2014
vor 9 Jahren

Allerdings ist es eh nicht der richtige Weg, CodeDom zu benutzen, wenn es nur darum geht, eine IP-Adresse auszutauschen.

Dann sag mir bitte was dann der "richtige Weg" ist? Ich will nicht umbedingt zwanghaft CodeDOM benutzen.

Mit dem @-Zeichen davor, habe ich aber das Problem das " nicht funktoniert.

16.807 Beiträge seit 2008
vor 9 Jahren

Sowas wie eine IP sollte gar nicht fest im Code stehen sondern extern konfigurierbar (zB XML) sein.

P
660 Beiträge seit 2008
vor 9 Jahren

Mit dem @-Zeichen davor, habe ich aber das Problem das " nicht funktoniert.

Das lässt sich damit lösen in dem man "" schreibt

Also so:


var MyString = @"blabla ""FooBar"" more blabla
and even with a NewLine!";

Wie Abt schon sagte, sowas wie eine IP-Adress (und der Port) gehört in eine Config-Datei.

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"

Hinweis von herbivore vor 9 Jahren

Die Frage nach der IP-Adresse hat mit dem tatsächlich behandelten CodeDom-Thema nichts zu tun, auch wenn erstere hier dein eigentliches Problem zu sein scheint. Sie fällt zudem unter [Hinweis] Wie poste ich richtig? Punkt 1.1.1. Auch zu dem eigentlichen Thema ist spätestens nach der Antwort von ProGamer alles gesagt.

Thema geschlossen