
Эта статья - продолжение поста "
Script# - мощь C# и поддержка Visual Studio для клиентского Java Script".
Когда я прочитал общее описание Script#, все казалось простым и понятным, как форма поиска Google. Пишешь код на C#, компилируешь свое приложение - и получаешь нужные java scripts, которые замечательно работают под всеми браузерами. И уже не нужно вспоминать DOM модель браузеров, и тем более их различия - все можно делать на C#, который ты так хорошо знаешь (кто спросил, что быстрее, упаковка или распаковка? нуу ... видете ли ... по сравнению с другими операциями в ASP.NET, такими как обращение к базе или передача html-а браузеру, такими мелочами можно пренебречь, да? :( ).
Но, когда я создал новое web-приложение, подключил к нему необходимые библиотеки и попробовал написать код на C#, то вместо ожидаемых скриптов на выходе получил ошибку компилятора
Тип 'System.Byte' существует как в 'c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\mywebsite3\7bbce1b3\88786863\assembly\dl3\5c35aa86\00f49d47_1443c801\sscorlib.DLL', так и в 'c:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll'
И вот тут-то пришлось вздохнуть, и начинать разбираться дальше. Итак ...
Технология Script# состоит из:
- Компилятора ssc.exe, который преобразует код, написанный на C# в .js файлы
Это .NET компилятор, который вместо MSIL кода формирует java script. Причем, в зависимости от debug режима, формируются либо XXX.debug.js файлы, которые сохраняют структуру вашего C# кода и удобны для отладки, либо XXX.js файлы, которые сжаты за счет выбрасывания ненужных whitespace символов, нечитабельны, зато занимают куда меньше места.
- Библиотеки базовых типов и классов Script#: sscorlib.dll, ssfx.Core.dll, ssfx.UI.Forms.dll и некоторые другие
Базовые библиотеки позволяют вам использовать привычные .NET типы (Byte, Int16, Int32, DateTime) и классы, например StringBuilder или CultureInfo. Кроме этого, они содержат классы, поддерживающие программную модель (класс Application и связанные с ним механизмы dispose, управления сессиями, загрузкой скриптов etc.), а так же позволяют вам обмениваться данными с web-сервером (классы HttpRequest \ HttpResponce) или использовать привычные элементы управления Button или TextBox.
- Библиотеки поддержки API таких технологий как ASP.NET AJAX, Virtual Earth, Silverlight и др.
Эти библиотеки добавляют поддержку объектных моделей перечисленных технологий. Таким образом, у вас есть возможность использовать в C# коде объекты, скажем из Virtual Earth, получая всю мощь поддержки IntelliSence.
- Разнообразные шаблоны проектов и сущностей (items) для Visual Studio
После инсталляции Script# у вас появятся новые типы проектов, такие как "Script# enabled Web-site", "Script# class library" или "Sidebar Gadget".
Работу Script# можно представить следующим образом (эту картинку я позаимствовал из документации к Script#):
- Вы пишете код на Script#, используя привычные классы и элементы управления ASP.NET.
- Компилятор С# осуществляет проверку типов и проверяет правильность вашего кода.
При этом обязательно нужно подключить библиотеки Script# и отключить стандартные .NET библиотеки, например mscorlib.dll. Понятно, что на jscript можно перевести не все, что вы бы могли написать на C# под ASP.NET. Поэтому, можно считать, что базовая библиотека Script# sscorlib.dll - это упрощенный вариант библиотеки .NET mscorlib.dll.
Sscorlib.dll содержит переопределения стандартных типов и классов .NET, которые компилятор Script# умеет переводить в скрипты.
Прим. это как раз и было причиной ошибки, о которой я упомянул в самом начале. Когда я просто подключил к web-проекту базовые библиотеки Script#, такие типы как Byte, Int16, Int32, DateTime, String, Object и многие другие оказалась определенными дважды: один раз в библиотеках .NET и второй раз - в Script#.
- Компилятор Script# формирует jscript файлы, транслируя использованные вами конструкции C# в аналогичные конструкции jscript. Так, классы и наследование будут реализованы при помощи концепции прототипов в jscript. Например вот такой код на C#
namespace Demo
{
public class Employee : Person
{
public Employee(string name) : base(name) { ... }
}
}
будет преобразован в следующий код на jscript
Demo.Employee = function(name)
{
Demo.Employee.initializeBase(this, [ name ]);
}
Demo.Employee.createClass("Demo.Employee", Demo.Person);
- Сгенерированные скрипты, а так же ссылки на базовую библиотеку скриптов Script#, вы добавляете на нужную вам ASP.NET страницу:
<script type="text/javascript" src="sscorlib.js"></script>
<script type="text/javascript" src="ssfxcore.js"></script>
<script type="text/javascript" src="MyScript.js"></script>
Кроме стандартных классов и механизмов к Script# постоянно добавляются библиотеки поддержки API других технологий. Сейчас можно назвать:
- Microsoft Silverlight XAML DOM (ssagctrl.dll) - поддержка Silverlight 2.0
- Microsoft Virtual Earth APIs (ssve4.dll) - поддержка Virtual Earth
- Windows Vista Sidebar Gadgets (ssgadgets.dll) - создание гаджетов для Windows Vista
- File System APIs (ssfso.dll) - объектная модель FileSystem Scripting Object (этот объект можно использовать в trusted script applications)
- RSS Feeds (ssfeeds.dll) - поддержка RSS в IE 7.0
Таким образом, мы можем писать высокоуровневый код, используя IntelliSence, а потом компилятор сгенерирует все необходимые скрипты, обращающиеся к скриптовому API этих решений. И, что приятно, все вышеперечисленые расширения добавлялись уже после выхода первого релиза Script#. Так что? будем надеяться, что эта тенденция сохраниться и дальше :)
У нас остался еще одна нераскрытая тема - поддержка Script# в Visual Studio. Если вы откроете какой-либо проект, использующий Script#, то вряд ли найдете там ссылки, а ля:
<script type="text/javascript" src="sscorlib.js"></script>
<script type="text/javascript" src="ssfxcore.js"></script>
<script type="text/javascript" src="MyScript.js"></script>
зато почти наверняка столкнетесь с новым элементом управления "<ssfx:scriptlet>" или какими-то проектами в папке Bin, которая, вроде как, должна содержать только используемые библиотеки и связанные с ними служебные файлы.
Я собираюсь описать это в одном из следующих постов, а пока - удачи вам и приятного выходного вечера!