Ссылка и использование функций JScript.NET только в сборке exe

1. Собранная сборка от АО

Я скомпилировал то, что предназначено для клиентского JavaScript, используя компилятор JScript (jsc.exe) на стороне сервера, пытаясь сделать что-то, что можно протестировать из проекта модульного тестирования, и, возможно, даже что-то, что можно отладить. на стороне сервера.

Скомпилированный файл содержит только функции следующим образом (просто для примера) и прекрасно компилируется в BitField.exe. Обратите внимание, что в исходном коде нет класса-оболочки или пакета.

------ НАЧАЛО ФАЙЛА (BitField.js) -------

function BitField(){
    this.values = [];
}
// more functions ...

------- КОНЕЦ ФАЙЛА -------

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

В результате создается сборка BitField.exe.

Успех! Ну, вроде....


2. Проверка сборки/точки доступа?

Во-вторых, я создал тестовый проект (на C#) и успешно сослался на сборку BitField.exe. (Тип проекта не имеет значения, но я даю больше описания, чтобы нарисовать полную картину.)

Похоже, проблема заключается в следующем: Я не могу найти пространство имен или точку, в которой я могу получить доступ к функциям BitField внутри сборки BitField.exe из моего тестового проекта C#. Сборка не выглядит "нормальной".

Другими словами, мне нужно в С#

using ???WHAT???

Примечание. Я не хочу использовать "расширения" JScript, то есть ключевые слова, которые не будут выполняться на стороне клиента (в веб-браузере), например, class, package и т. д., потому что мне нужен код быть максимально чистым для копирования и вставки обратно в среду сценария на стороне клиента (независимо от того, что «чистый» код отлично компилируется jsc.exe без использования этих расширений). Когда я пытаюсь обернуть функции в package и class, он начинает выдавать ошибки компиляции, так что это еще одна причина не использовать их - потому что они, похоже, заставляют меня изменять мой код.

Любые предложения относительно того, как я могу использовать функции скомпилированной сборки JScript (путем ссылки на нее в другую сборку), когда в ней нет явных контейнеров?


Обновление/доказательство

Представление .NET Reflector
alt text


person John K    schedule 21.08.2010    source источник
comment
Вы смотрели на сгенерированную сборку с помощью .NET Reflector? Вы не забыли сделать его классы общедоступными? В каком пространстве имен вы объявили свои функции?   -  person EricLaw    schedule 21.08.2010
comment
@EricLaw: в исходном коде нет класса, как говорится в вопросе. .NET Reflector не помогает в этом случае — не может ссылаться на то, что показывает. В исходнике также не объявлено пространство имен.   -  person John K    schedule 21.08.2010


Ответы (1)


Поиграв с ним некоторое время и попробовав различные комбинации переключателей командной строки для jsc.exe, я почти уверен, что то, что вы пытаетесь сделать, не будет работать так, как вам хотелось бы. Если вы попытаетесь скомпилировать файл js, содержащий функции, в сборку библиотеки .Net, вы получите сообщение об ошибке:

BitField.js(1,1) : error JS1234: Only type and package definitions are allowed inside a library

Но пока есть надежда! Вот что бы я сделал...

Я бы оставил ваш «чистый» файл BitField.js таким, какой он есть, а затем создал пакетный файл, который оборачивает его в класс JScript и записывает в «грязный» файл js. Это довольно чисто, если рассматривать это как часть компиляции кода в DLL. Код для переноса BitField.js в BitFieldClass.js будет выглядеть следующим образом:

слияние-в-класс.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();

Затем пакетный файл, чтобы обернуть его и скомпилировать, очень прост:

compile-js.bat

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

Конечно, если вы хотите сделать несколько файлов, вам придется немного параметризовать вещи, но, надеюсь, этого достаточно, чтобы продемонстрировать идею.

person Chris Jaynes    schedule 01.10.2010
comment
Это жизнеспособное решение, и мне нравится, что его можно автоматизировать. - person John K; 01.10.2010
comment
На самом деле я надеюсь на более прямое решение вместо обходного пути, но это может быть напрасно. Поэтому я решил оставить решение о вознаграждении сообществу через механизм голосования. У меня такое чувство, что есть ответ, чтобы описать, почему эта проблема возникает с прямым решением. Но только время покажет. Даже награда не вызвала большой активности, поэтому я подозреваю, что это сложно. А пока я буду использовать обходной путь и оценю его. - person John K; 09.10.2010
comment
Это честно. Однако я не думаю, что вы найдете прямое решение, основанное на том, как работает компилятор. Кажется, что весь код за пределами класса компилируется в общий класс сценария, подобно тому, как Groovy компилирует сценарии. Люди, написавшие компилятор, похоже, приложили немало усилий, чтобы убедиться, что вы не можете получить прямой доступ к этому классу скрипта, поэтому я предполагаю, что вам не повезло, но я надеюсь, что вы найдете то, что ищете! - person Chris Jaynes; 09.10.2010