| 

.NET C# Java Javascript Exception

5
Hallo! Ich habe mir was überlegt: Im Browser hat man ja nur JavaScript. Damit kann man aber COM-Objekte instanziieren. Könnte man nicht den lokalen C#-Compiler als COM-Objekt instanziieren, C#-Code on thefly kompilieren, und den dann in der Seite nutzen? Also clientseitig, quasi wie JavaScript, sozusagen als C# Script? Ginge das?
News:
10.06.2011
OffensichtlichRichtig 51 1 3
5 Antworten
6
Erstens: Du kannst den vorhanden C#-Compiler nicht über JavaScript oder die COM-Schnittstellen ansprachen.

ABER, zweitens: Du kannst ein eigenes WinForms-Steuerelement machen, das COM-Visible ist (Einstellung in der Projekt-Datei) und das Interface IObjectSafety (^= SaveForScripting) implementiert. Wenn du nun das Steuerelement signierst, kann es wie ein normales ActiveX-Plugin vom Browser geladen werden (auch vom Webserver, also ohne Installation) und lässt sich auch vom JavaScript herraus ansprechen. Nun musst du das Steuerelement mit einer Methode ausstatten die es dir erlaubt etwas Quellcode zu übergeben und selbigen an den CSharpCodeProvider übergibt. Wenn der übersetzte Quellcode ein Objekt sein soll, welcher wiederum vom Browser ansprechbar sein soll, musst du natürlich den Code zu einer Klasse verpacken die wiederrum das Interface IObjectSafety implementiert und COM-Visible ist (ggf. musst du es sogar noch signieren, das müsste man erstmal ausprobieren).

Und Ja: COM-Componenten die SaveForScripting sind, lassen sich vom JavaScript herraus instanzieren und ansprechen.
Nur so als nebenläufiger Hinweis, der gesammte JavaScript-Compiler bis hin zum IE 8 ist eine COM-Componenten.

Ein interessanter Artikel zu dem Thema: Creating activex objects with c#

Aber gib dich keinen Illusionen hin. Das ganze ist nichts für einen Hobby-Programmierer und hat einige Klippen die man umschiffen muss. Aber, es ist möglich!
10.06.2011
Floyd 14,6k 3 9
3
Hallo,

verwende doch Silverligth. Das was du vorhast wäre ja ein Mega-Sicherheitsloch.

mfG Gü
10.06.2011
gfoidl 9,4k 3 5
1
Hm, also selbst wenn


  • der C#-Compiler sich als COM-Objekt instanziieren ließe (warum sollte er?), und
  • dieses COM-Objekt dann eine öffentliche API zum Kompilieren von C#-Code anböte, und
  • Du das Problem lösen könntest, wie Du an die referenzierten .NET-DLLs herankommst, die Du brauchst, um irgendwas halbwegs nicht-triviales programmieren zu können,

müßtest Du immer noch an das erzeugte Kompilat herankommen. Das wäre eine .NET-Assembly, die könntest Du selbst nur wiederum ansprechen, wenn sie über COM verfügbar ist, und dazu müßtest Du sie erst mal lokal installieren, oder?

Ach ja: COM aus Javascript??? Ich hätte gedacht, dazu braucht es VBScript?

Alles in allem: nein, das wird sicher nicht gehen. Und wozu eigentlich?
10.06.2011
Matthias Hlawatsch 13,2k 4 9
1
Und es geht doch. Sowohl COM-Componenten aus JavaScript herraus aufzurufen, als auch (zugegebener maßen über einen Umweg) den C#-Compiler über COM anzusprechen.
Hab das ganze mal in einer eigenen Antwort ausführlich beschrieben.
Floyd 10.06.2011
1
OK, Punkt 1 und 2 könnten sich damit lösen lassen. Bei Punkt 3 - Referenzieren von anderen .NET-Assemblys beim Aufruf des Compilers - wäre ich nach wie vor skeptisch, aber wenn der Rest geht, dann vielleicht auch das.
Aber IE-only ist die Lösung am Ende noch, oder?
Brrrr, irgendwie fühlt sich das doch ziemlich gruselig an. Trotzdem: Chapeau und +1!
Matthias Hlawatsch 10.06.2011
1
Der CSharpCodeProvider hat eine Eigenschafft ReferencedAssemblies mit der man beliebige andere .Net-Assemblys referenzieren kann. Also ja, es würe gehen :D
Die Lösung ist IE-Only, da hast du recht. Aber das sind sämtliche COM-Lösungen. ABER wenn man sich noch etwas hinsetzt und eine NAPI-Wrapper für das Steuerelement schreibt, dann läßt sich das Plugin auch in FireFox und Chrome laden. Ist nur noch mehr arbeit.
Gruselig ist es wirklich. Nicht nur die Menge an Arbeit sondern auch das Sicherheitsloch was man sich damit in den Rechner holt.
Floyd 10.06.2011
1
ReferencedAssemblies kenne ich. Das sind ja erstmal nur strings. Was ich meinte: ob der Compiler in dieser Umgebung dann auch tatsächlich auf den GAC zugreifen und diese Assemblies laden kann. Aber vermutlich ist die Liste dessen, was ActiveXControls alles dürfen und können, die nächste Grusel-Liste...
Matthias Hlawatsch 11.06.2011
Ja, er greift auf den GAC zu und läd die entsprechenden Assemblies.
Floyd 11.06.2011
1
Für den Fall, dass hier mal wieder jemand reinstolpert: die dotnetpro listet aktuell drei Tools auf, die in der einen oder anderen Weise in C# geschriebenen Code im Browser zum Laufen bringen können.
24.09.2012
Matthias Hlawatsch 13,2k 4 9
0
Das, was Du vorschlägst hört sich gruselig an. Eine HTML-Seite mit C# als Skriptsprache wirst Du nicht hinbekommen, wenn Du auf C# bestehst bleiben Dir nur Silverlight und XBAP-Anwendungen.

Nebenbei, was würde dir C#-Script bringen?
16.06.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH