Annual Open Tech Conference - ISsoft Insights 2021. June 19. Learn more.
×Закрыть

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

В крупных проектах зачастую возникает необходимость (ну или по крайней мере сильное желание) писать код на разных языках. Например, большая часть кода написана на 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 BooAddIn
import 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.

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті.

👍НравитсяПонравилось0
В избранноеВ избранном0
Подписаться на автора
LinkedIn

Похожие статьи




Підписуйтесь: Soundcloud | Google Podcast | YouTube


20 комментариев

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.

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

ну да, синтаксис — питонообразный: -) надо наверное написать еще об отличиях Boo от c#

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Классно! Сначала подумалось, что boo — это маленькая мягкая реализация питона: -) Оказалось — нет: http://boo.codehaus.org/Gotcha...Поправьте, плз: в слове обертка нет буквы «в»: -)

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

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

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

Подписаться на комментарии