Блог разработчиков

Вавилонское столпотворение в .NET проекте

cleg
Опубликовано 16.08.2007 в Разработка

В крупных проектах зачастую возникает необходимость (ну или по крайней мере сильное желание) писать код на разных языках. Например, большая часть кода написана на C, часть была быстро накидана в виде прототипа на Python, а кусок для работы с базой знаний был вообще сделан на каком-то декларативном языке. Объединить все это вместе раньше было довольно проблематично – разные форматы данных, абсолютно разная организация памяти, и многие другие причины мешали с легкостью составлять вместе «кирпичики» кода на разных языках.

Благодаря CLS, принятой для языков платформы .NET это делается очень легко и непринужденно. Сейчас я покажу это на простом примере. Рассказ для наглядности будет снабжен максимально разумным числом картинок.

Допустим нам надо создать маленькую программку, запускающую Internet Explorer и направляющую его на нужную нам страницу. Конечно проще всего сформировать правильный URL и отдать его на растерзание функции типа ShellExecute. Но мы не ищем легких путей, поэтому я предлагаю усложнить задачу. Управлять открытым IE мы будем как объектом COM. Зачем так усложнять жизнь я расскажу ближе к концу, а пока что просто решим поставленную задачу.

Для управления COM-объектами замечательно подходит язык Boo, благодаря заложенной в него архитектуре динамической (утиной) типизации. Собственно таким и будет наше тренировочное приложение: класс-обертка для Internet Explorer’a, написанный на Boo и управляющая программа на C#.

Для небольших проектов (как в данном случае) я рекомендую использовать IDE SharpDevelop (www.icsharpcode.com), помимо полной бесплатности он еще обладает замечательным биндингом для Boo.

Начнем работу с создание управляющего приложения, выберем в меню File – New Solution, тип решения установим в C# Windows Application.

Рисунок 1.

Теперь добавим в решение проект для класса на Boo. Для этого в окне инспектора проектов щелкнем правой кнопкой мышки на нашем решении и выберем Add – New Project.

Рисунок 2

Тип проекта выберем Boo – Class Library.

Рисунок 3

Теперь необходимо добавить ссылку на «дочерний» проект в главный проект на C#. Для этого из контекстного меню C# проекта выберем пункт Add reference.

Рисунок 4.

В появившемся окне, на второй закладке, отвечающей за референсы на проекты выберем наш Boo-проект и нажмем Select.

Рисунк 5

Вуаля! Все работает. Это подтверждается добавлением BooAddIn в список References главного проекта и работоспособностью IntelliSence в главном проекте.

Рисунок 6

Теперь настала пора написать немного кода :-).

Для начала – вспомогательный класс прослойка.

namespace BooAddInimport System

class IEWrapper:

"""Wrap IE for our uses"""

 ie as duck

def constructor():

 """Create a wrapper"""

 	ie = System.Type.GetTypeFromProgID("InternetExplorer.Application")()

def NavigateTo(url as string):

 """Show IE Window and navigate to URL"""

 	ie.Visible = true

 	ie.Navigate2(url)

Мы создали класс, содержащий одно поле (переменную-хранилище COM-объекта) и 2 метода. Первый – конструктор, создает экземпляр COM объекта и «привязывает» его к полю класса ie. Поскольку член класса ie объявлен как тип duck, нам нет необходимости выполнять какие-либо действия по декларированию типа и т.п. Тут на полную будет работать динамическая типизация.

Второй метод – получает 1 строковой параметр, показывает окно IE и «отправляет» его по нужному нам адресу.
Создать «основную программу» еще легче – просто в визуальном дизайнере форм размещаем одно текстовое поле и одну кнопку. Немного правим конструктор и обработчик нажатия кнопки. Вот что должно получиться.

using System;
using System.Windows.Forms;
using BooAddIn;namespace MainApp
{
    public partial class MainForm : Form
    {
        IEWrapper iew;

        public MainForm()
        {
            InitializeComponent();
            iew = new IEWrapper();
        }

        void GoButtonClick(object sender, EventArgs e)
        {
            iew.NavigateTo(urlBox.Text);
        }
    }
}

Если все сделано правильно, то после нажатия на кнопку Run мы получим искомую запускалку.

Рисунок 7.

Последнее что стоит рассказать – зачем же нам понадобилось мучиться с COM. Очень просто, управляя IE как COM-объектом, мы можем добиться от него куда большего чем просто запуска и открытия страницы.

Например, после загрузки документа мы можем получить все заголовки 2 уровня и что-то с ними сделать.

h2s = ie.Document.getElementsByTagName("h2")

for hdr in h2s:

 	print(hdr)

Это открывает очень богатые возможности, например, для автоматического тестирования Web-сайтов прямо браузером (hint: Boo отлично интегрируется в NUnit).

Вот и все на сегодня, я был бы очень признателен за отзывы, стоит ли продолжать тему нестандартных языков .NET.

Теги: , , , , ,

1 звезда2 звезды3 звезды4 звезды5 звезд (1 голосов, средний: 2 из 5)
Загрузка ... Загрузка ...
Распределение голосов

Понравилась статья? Подпишись на обновления по RSS/E-mail

Подписаться, не оставляя комментарий

Все комментарии (20) к “Вавилонское столпотворение в .NET проекте” RSS

  1. Сергей говорит:

    Нашел много интересного, но вот как раз не связанного с основной темой - многоязычностью .net. Например, не знал что есть серьезная и бесплатная среда разработки. Да и копаться в браузере как раз надо будет скоро.

    Я кстати для работы с com объекстами имопользовал обычно VB.NET, не знаю, дотягивает ли это по удобству до Boo, но там это тоже намного проще чем в C#.

  2. cleg говорит:

    тут аж желание написать на Boo класс-обертку для IE…

  3. Serjio говорит:

    Да стоит! Статья отличная

  4. Caujka говорит:

    Классно!

    Сначала подумалось, что boo - это маленькая мягкая реализация питона :-) Оказалось - нет: http://boo.codehaus.org/Gotchas+for+Python+Users

    Поправьте, плз: в слове обертка нет буквы “в” :-)

  5. DmitryZhariy говорит:

    Хорошая заметка. Спасибо!

  6. Сергей говорит:

    Сайту нужна подсветка синтаксиса!

  7. Женя Шифрин говорит:

    При том что среда .NET хорошо поддерживаем многоязычие, при отходе от стандартных языков (а особенно от C#) стоит подумать есть ли
    в этом резон. так как многоязыкое решение поддерживать будет сложнее.

  8. Макс Ищенко говорит:

    2Сергей: подсветка как бы есть, просто C#NET пока не поддерживается.

  9. Andrew говорит:

    Согласен с Женей Шифриным это многоязычие всего ли пиар ход майкрософт, чтоб перетянуть всех на свою платформу, пока же стандартом NET является C#, сам пишу на нем 3 года, но когда сталкиваюсь с кодом на VB, впадаю в кому, а тут еще Boo, IronPhyton.Плюс насколько мне помнится после того как при построении вавилонской башни все стали разговаривать на разных языках работа стала :)

  10. Alex Baran говорит:

    “мне помнится после того как при построении вавилонской башни все стали разговаривать на разных языках работа стала”

    Я б сказал тут аналогия с М$, башню хотели до небес построить

  11. cleg говорит:

    упорно не понимаю сути возражений :-)

    никто ж не заставляет пользоваться vb, Boo и т.д…. но если захочется/припрет, то делается это с легкостью :-)

    что я и постарался показать статьей :-)

  12. koder говорит:

    Andrew говорит: 17.08.2007 в 09:32
    Согласен с Женей Шифриным это многоязычие всего ли пиар ход майкрософт

    А можно это как-то аргументировать? Вот, например в IronPython, вполне можно
    поднять стороннюю сборку(написанную на чем угодно) и использовать как “родную”.
    Гораздо проще чем ctypes или оборачивать. Где здесь “пиар ход”? Все вполне
    нормально ( как для Microsoft продукта, так более чем нормально) работает. Поддержка многоязыкового приложения имеет(IMO) только один
    существенный минус - если все “носители” одного из языков уволятся. Ну еще
    бОльшее количество внешних зависимостей, но для программы под .NET “еще 35 зависимостей” IMHO не особо тяжко )). В остальном и разработка ускоряется
    и добавление новых возможностей ( большая часть поддержки, кстати ) тоже. А при аккуратном дизайне т.е. четко описанным, небольшим, количеством точек межмодульного ( межязыкового ) взаимодействия можно в критичной ситуации и на
    другой язык переписать.

    P.S. Статья интересная, особенно порадовал SharpDeveloper, но, лично для меня,
    было-бы интереснее если-бы код был на IronPython вместо Boooo ;).

  13. Andrew говорит:

    Да обсуждалось это уже тысячу раз про IronPython, что от него только оболочка осталась, т.е. синтаксис, ядро то .NET, а от него у питонистов слезы наворачиваются, не спрашивайте, не знаю почему :).

  14. cleg говорит:

    лично для меня,
    было-бы интереснее если-бы код был на IronPython вместо Boooo ;).

    порсто первая моя статья серии была про boo, эта - продолжение. про IronPython “далi буде” :-)
    хотя что про него писать вообще не ясно. будет наверное NET специфичный пример :-)

  15. koder говорит:

    IronPython был только примером.

    <offtop>
    Кстати разработчики IronPython стараются . Вторая версия гораздо ближе
    к Python чем первая, и уже вполне удобоваримая, вот только ^%*!&#$%*&.NET сборщик мусора - это тот самый праздник, который навсегда с ними ;).
    </offtop>

  16. Pavel говорит:

    Не хочет у меня пример компилироваться! Хоть что делай. boo всякие ошибки пишет.
    Сначала ругается что constructor уже определен. Когда перенес код из конструктора в метод, стал ругаться что у ie должны быть заданы методы, которые пытаюсь вызвать.

    Можно хоть где нить выложить исходники?

  17. cleg говорит:

    Пожалуйста

    http://rapidshare.com/files/50627451/Proj.zip.html

    ЗЫ Мой первый опыт упаковки .NET проекта. Мог что-то недовложить. Не обезсудте. :-)

  18. Pavel говорит:

    Спасиб! все дело оказалось в отступах!
    Я как то до этого не знал о boo так сильно и много

  19. cleg говорит:

    ну да, синтаксис - питонообразный :-)

    надо наверное написать еще об отличиях Boo от c#

  20. kj говорит:

    у ВБ.НЕТ есть реальное преимущество перед С№ при использовании СОМ. Если у других языков есть какие-то свои преимущества (для многих людей это чисто субъективный фактор) - то велкам в .нет.

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

Указать свой сайт могут только зарегистрированные пользователи. Регистрация или вход.

Архив

Комментарии

Последние комментарии