Позоваване и използване на 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#. Сглобката не изглежда "нормална".

С други думи, имам нужда от C#

using ???WHAT???

Забележка: Не искам да използвам „разширения“ на JScript, което означава ключови думи, които няма да се изпълняват от страна на клиента (в уеб браузър), например class, package и т.н., защото искам кода да бъде възможно най-чист за копиране и поставяне обратно в среда на скрипт от страна на клиента (независимо от споменатия "чист" код, който се компилира добре от jsc.exe без използване на тези разширения). Когато се опитам да обвия функциите в package и class, той започва да създава грешки при компилиране, така че това е още една причина да не ги използвам - защото изглежда ме карат да променям кода си.

Някакви предложения за това как мога да използвам функциите на компилирания JScript сборник (като го препратя към друг сборник), когато в него няма изрични контейнери?


Актуализация / доказателство

.NET Reflector изглед
алт текст


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 ще изглежда така:

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();

След това груповият файл, за да го обвиете и компилирате, е наистина прост:

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