18 марта 2013 г.

Вызов управляемого кода в WinJS. Часть 1

Все любят C#!

Нет, ну правда же? Лично для меня C# остается самым удобным языком, как в плане своих возможностей, так и в плане синтаксиса.

Если же сравнивать C# и JavaScript в плане возможностей, список отличий получится длинной в книгу, и JavaScript в этом сравнении явно не выигрывает.

Собственно поэтому, разработчики WinJS позаботились о том, чтобы мы могли по прежнему использовать C# код в своих Windows Store JavaScript приложениях. Как это можно сделать и какие при этом накладываются ограничения мы подробно рассмотрим в этой статье.

Подготовка C# кода

Для начала стоит начать со стороны C# кода. В Visual Studio 2012 был представлен шаблон для нового вида проекта - Windows Runtime Component:

Только этот тип проекта вы можете добавить, как Reference, к своему JavaScript проекту. И, соответственно, все классы C#, которые вы хотите использовать, следует поместить в такой проект. Создадим самый простой класс, исключительно для демонстрации существующих ограничений:

   1:  namespace WinJsDemo.Utilities
   2:  {
   3:      public sealed class ManagementClass
   4:      {
   5:          public string GetHelloString(string name)
   6:          {
   7:              return "Hello " + name;
   8:          }
   9:      }
  10:  }

[Это важно] Приведенный выше пример будет работать, но использовать его ни в коем случае не стоит, так вызов подобного метода будет происходить в синхронном режиме (то есть в главном потоке UI). В случае задержки все ваше приложение будет "висеть", ожидая ответа из управляемой среды. Как правильно вызывать метод асинхронно будет рассмотрено в следующей статье.

Итак, сходу, мы упираемся в главные ограничения при использовании управляемой среды, вот наиболее существенные из них:

  1. Свойства, поля, параметры и возвращаемые значения методов всех публичных классов должны быть из семейства Windows Runtime;
  2. Публичные классы и интерфейсы не могут быть дженериками;
  3. Публичные классы не могут реализовывать интерфейсы, которые не находятся в Windows Runtime;
  4. Публичные классы не могут быть унаследованными от типов, которые не находятся в Windows Runtime;
  5. Все публичные классы должно находится в корневом пространстве имен сборки (при этом имя сборки должно совпадать с именем корневого пространства имен);
  6. Имя сборки не должно начинаться со слова "Windows";
  7. Публичные структуры не могут иметь никаких членов, кроме публичных полей. При этом тип данных публичных полей должен быть Value Type или String;
  8. Все публичные классы должны быть объявлены, как закрытые от наследования (с модификатором sealed).
Вызов из JavaScript

Стоит отметить, что использование на стороне JavaScript крайне простое - достаточно добавить ссылку на сборку типа Windows Runtime Component, после чего простарнство имен сборки будет доступно в любом месте JavaScript кода:

   1:  (function () {
   2:      "use strict";
   3:      
   4:      var app = WinJS.Application;
   5:      
   6:      app.onready = function(args) {
   7:          var myClass = new WinJsDemo.Utilities.ManagementClass();
   8:          document.getElementById("content").innerHTML = myClass.getHelloString("Jack");
   9:      };
  10:   
  11:      app.start();
  12:  })();

Таким образом, использование управляемого кода открывает широкие возможности для Windows 8 разработчиков, позволяя интегрировать в свои JavaScript приложения бизнес логику любой сложности. Однако не стоит увлекаться вызовами C# кода, те функции которые можно написать на JavaScript - стоит писать на JavaScript.

Собственно, пока это все, что я хотел вам рассказать. С асинхронными вызовами управляемых методов и примерами передачи сложных типов данных между C# и JavaScript, мы познакомимся в следующей статье.

Полезные ссылки вы найдете ниже. Спасибо за внимание. Приятной разработки на Windows 8!

  1. [MSDN] Создание управляемого кода для использования в WinJS
  2. Использование старого C# кода в приложениях Windows Store

Комментариев нет:

Отправить комментарий