6 Stimmen

Bezugnahme und Verwendung von JScript.NET "Funktionen nur" exe-Assembly

1. Kompilierte Assembly von JSC

Ich habe das beabsichtigte clientseitige JavaScript mit dem JScript-Compiler (jsc.exe) auf der Serverseite kompiliert, um etwas zu erstellen, das von einem Unit-Testing-Projekt getestet werden kann, und möglicherweise sogar etwas, das auf der Serverseite debuggt werden kann.

Die kompilierte Datei enthält nur Funktionen wie folgt (nur als Beispiel) und sie kompiliert problemlos in BitField.exe. Beachten Sie, dass im Quellcode keine Wrapperklasse oder Paket vorhanden sind.

------- ANFANG DATEI (BitField.js) -------

function BitField(){
    this.values = [];
}
// weitere Funktionen ...

------- ENDE DATEI -------

jsc /fast-  /out:BitField.exe Bitfield.js

Ergebnis ist eine BitField.exe Assembly.

Erfolg! Na ja, irgendwie ....


2. Test-Assembly / Zugriffspunkt?

Zweitens habe ich ein Testprojekt (in C#) erstellt und erfolgreich auf die BitField.exe Assembly verwiesen. (Der Projekttyp ist irrelevant, aber ich gebe mehr Beschreibung, um ein vollständiges Bild zu zeichnen.)

Das Problem scheint zu sein: Ich kann den Namespace oder einen Punkt nicht finden, an dem ich die BitField-Funktionen innerhalb der BitField.exe-Assembly von meinem C#-Testprojekt aus aufrufen kann. Die Assembly scheint nicht "normal" zu sein.

Mit anderen Worten benötige ich in C#

using ???WAS???

Hinweis: Ich möchte keine JScript-"Erweiterungen" verwenden, d.h. Schlüsselwörter, die nicht clientseitig (im Webbrowser) ausgeführt werden, z. B. class, package usw., weil ich möchte, dass der Code so sauber wie möglich ist, um ihn zurück in die clientseitige Skriptumgebung kopieren und einfügen zu können (Unabhängig davon compiliert der genannte "saubere" Code problemlos mit jsc.exe ohne Verwendung dieser Erweiterungen). Wenn ich versuche, die Funktionen in package und class zu verpacken, treten Kompilierfehler auf, was ein weiterer Grund ist, sie nicht zu verwenden - weil sie mich anscheinend dazu zwingen, meinen Code zu ändern.

Habt ihr Vorschläge, wie ich die Funktionen der kompilierten JScript-Assembly (indem sie in eine andere Assembly referenziert wird) nutzen kann, wenn keine expliziten Container darin vorhanden sind?


Aktualisierung / Beweis

Ansicht im .NET Reflector
Alternativtext

2voto

Chris Jaynes Punkte 2770

Nachdem ich eine Weile damit gespielt habe und verschiedene Kombinationen von Befehlszeilenschaltern für jsc.exe ausprobiert habe, bin ich mir ziemlich sicher, dass das, was Sie versuchen zu tun, nicht so funktionieren wird, wie Sie es sich wünschen. Wenn Sie versuchen, eine js-Datei zu kompilieren, die Funktionen enthält, in eine .Net-Bibliotheksassembly, erhalten Sie einen Fehler:

BitField.js(1,1) : Fehler JS1234: Nur Typ- und Paketdefinitionen sind innerhalb einer Bibliothek erlaubt

Aber es besteht noch Hoffnung! Hier ist, was ich tun würde...

Ich würde Ihre "saubere" BitField.js-Datei so lassen, wie sie ist, und dann eine Batch-Datei erstellen, die sie in eine JScript-Klasse einhüllt und sie in eine "schmutzige" js-Datei schreibt. Es ist ziemlich einfach, wenn man es als Teil des Kompilierens des Codes in die DLL betrachtet. Der Code, um die BitField.js in BitFieldClass.js einzuhüllen, würde so aussehen:

merge-into-class.js

var fso = new ActiveXObject("Scripting.FileSystemObject");
var ForReading = 1;
var inputFile = fso.OpenTextFile("BitField.js", ForReading, false);
var outputFile = fso.CreateTextFile("BitFieldClass.js", true);

outputFile.write("class BitFieldClass{\n");
while (!inputFile.AtEndOfStream)
{
    var textLine = inputFile.ReadLine();
    outputFile.write (textLine + "\n");
}
outputFile.write("}");
outputFile.close();

Dann ist die Batch-Datei zum Einhüllen und Kompilieren wirklich einfach:

compile-js.bat

cscript merge-into-class.js
jsc /t:library /out:BitFieldClass.dll bitFieldClass.js

Natürlich müssten Sie, wenn Sie mehrere Dateien verwenden möchten, die Dinge ein wenig parametrisieren, aber hoffentlich ist dies genug, um die Idee zu verdeutlichen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X