hostingDLR Vitaly Baum
Alt.Net Spb Group
butaji.ruspbalt.net
«Единственное счастье в жизни — это постоянное
стремление вперед.»Эмиль Золя
DLR – WTF?DLR – Что это?
DLR - что это?
СредаИсполненияДинамическихЯзыков
DLR - что это?
Первое упоминание состоялось на Mix’07 1 мая 2007 года
DLR - что это?
DLR - что это?
• Позволяет реализовать динамические языки на .NET
• Предоставляет динамические возможности для статических языков
DLR - что это?
http://msmvps.com/blogs/jon_skeet/archive/2009/06/19/os-jam-at-google-london-c-4-and-the-dlr.aspx
DLR - что это?
Возможности для имплементированных языков при развитии .NET:• Garbage collector (GC)• Just-in-time compiler (JIT)• Sandbox Security Model («Песочница»)• Tools (Visual Studio, SQL Server)
DLR - что это?
Все библиотеки, реализованные для .NET доступны нам в динамических языках.
http://blogs.msdn.com/blogfiles/codeplex/WindowsLiveWriter/CodePlexinDenmarkandSweden_C442/DSC03124.jpg
DLR - что это?
http://github.com
Все библиотеки, реализованные на динамических языках доступны нам также.
DLR - что это?
В текущее время Microsoft поддерживает две реализации на DLR:
IronPython доступен в open source на www.codeplex.com/ironpython. IronRuby доступен в open source на http://rubyforge.org/projects/ironruby.
DLR - что это?
DLR - что это?
Введения в CLR для взаимодействия с динамическими языками:• Expression trees (семантика языка)• Call site caching (ускорение операций)• Dynamic object interoperability (точка
взаимодействия)
DLR - что это?
http://blogs.msdn.com/hugunin/archive/2007/05/02/the-one-true-object-part-1.aspx
The One True Object
DLR - что это?
http://blogs.msdn.com/hugunin/archive/2007/05/02/the-one-true-object-part-1.aspx
The One True Object
DLR - что это?
http://msdn.microsoft.com/en-us/library/dd233052(VS.100).aspx
DLR HOSTINGХостинг DLR в .NET приложениях
http://farm3.static.flickr.com/2017/2047711131_d4ce321ca9.jpg
DLR Hosting
• Исполнение фрагментов кода• Исполнение кода из файлов• Компиляция кода• Области исполнения и переменные
DLR Hosting
• В вашем браузере с помощью SilverLight• На сервере MerlinWeb• Интерактивные консоли, причём ScriptRuntime может
быть в другом приложении• Средства редактирования с подсветкой кода,
кодкомплитом и справкой (могут работать только на live объектах в 1ой версии)
• PowerShell, C#, и VB.NET используют динамические объекты и работают с ними в том же домене
DLR Hosting
Level One
Level Two
Level Three
DLR Hosting
Level One• Предоставить ОМ приложения для динамических языков• Исполнять файлы-потребители ОМ• Динамический код в качестве команд и обработичков
событий• ScriptRuntime.Globals, ScriptRuntime.ExecuteFile()
Level Two
Level Three
DLR Hosting
Level One
Level Two• Работа с кодом: компиляция, исполнение в нужной
области• Операции над объектами• ScriptEngine, ScriptScope, ObjectOperations
Level Three
DLR Hosting
Level One
Level Two
Level Three• Полный контроль над исполнением: обработка исключений,
использование удаленных сред• Разработка приложений для редактирования динамического кода• ScriptHost, ObjectOperations (GetMemberNames, IsCallable, GetCallSignatures,
GetDocumentation, GetCodeRepresentation)• ScriptSources, TextContentProviders
DLR Hosting
Виды хостинга:1. Активный2. Пассивный3. Дуплексный
DLR Hosting
АктивныйCL
R
App DLR Script
app.close
DLR Hosting
ПассивныйCLRApp DLRScri
pt
pyfunc(x)
DLR Hosting
ДуплексныйCLRApp DLRScri
pt
xy =func(x)
y
DLR Hosting
DLR Hosting
REPL Read-eval-print loop
DLR Hosting
http://www.iunknown.com/2009/05/dynamic-languages-at-teched-2009.html
DLR Hosting
Проблема:Не получается использовать Extension Methods, следовательно и LINQ.
DLR Hosting
Решение:1. Свой код2. Унаследованный код
DLR Hosting
Adapt your code
DLR Hosting
public class ClassToBeExtended {}public static class DemoExtensionClass{ public static string Foo(this ClassToBeExtended c) { return "Bar"; }}
http://blogs.msdn.com/saveenr/archive/2008/11/14/consuming-extension-methods-in-ironpython.aspx
DLR Hosting
>>> c1 = ClassToBeExtended() >>> c1.Foo() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'ClassToBeExtended' object has no attribute 'Foo'
DLR Hosting
using Microsoft.Scripting;[assembly: Microsoft.Scripting.Runtime.ExtensionType( typeof(ClassToBeExtended), typeof(DemoExtensionClass))]
DLR Hosting
>>> c1 = ClassToBeExtended() >>> c1.Foo() 'Bar'
DLR Hosting
Legacy code
DLR Hosting
Создаём Proxy, и действуем по «правилам своего кода»
Linq 2 Object vs Python
[myFunc(i) for i in numbers if i > 3]
from i in numberswhere i > 3select myFunc(i)
Linq 2 Object vs Python
Funcsneed that
Linq 2 Object vs Python
Select Where
Aggregate
mapfilterreduce
Linq 2 Object vs Python
map(myFunc, filter(lambda x: x > 3,
numbers))
Linq 2 Object vs Python
Queryable.Select(Queryable.Where(numbers,
x => x > 3), myFunc)
Linq 2 XML vs Python
head = soup.contents[0].contents[0] head.parent.name # u'html'soup.findAll('p', align="center")# [<p id="firstpara" align="center">This is paragraph <b>one</b>. </p>]
Beautiful Souphttp://www.crummy.com/software/BeautifulSoup/
IronPythonClass != .NET Class
class Calculator(object):def add(self, a, b):
return a + b
http://stackoverflow.com/questions/579272/instantiating-a-python-class-in-c
IronPythonClass != .NET Class
ScriptEngine engine = Python.CreateEngine();ScriptSource source = engine.CreateScriptSourceFromFile(
"Calculator.py");ScriptScope scope = engine.CreateScope();ObjectOperations op = engine.Operations;
IronPythonClass != .NET Class
// создается класс
source.Execute(scope); // получаем класс
object calculator = scope.GetVariable("Calculator"); // создаём экземпляр
object instance = op.Invoke(calculator); // получаем метод
object method = op.GetMember(instance, "add"); // вызываем метод
int result = (int)op.Call(method, 4, 5);
IronPythonClass != .NET Class
ScriptRuntime py = Python.CreateRuntime();dynamic helloworld = py.UseFile("helloworld.py");helloworld.Calculator().Add(1, 10)
.NET 4.0
DLR + SHAREPOINTРасширяем c помощью DLR приложение на SharePoint
IPy 4 SPD
• SharePoint Designer позволяет производить настройку
• Не является инструментом разработчика• 3-х этапный рабочий процесс – существует
по-умолчанию• Почему бы не сделать его расширяемым?
IPy 4 SPD
Задача:Предоставить системному администратору возможность создавать рабочие процессы и расширять их с помощью Python-сценариев
IPy 4 SPD
IPy 4 SPD
__actprops__ (свойства раб. процесса)__site__ (текущий SPSite)__web__ (текущий SPWeb)__list__ (текущий SPList)__item__ (текущая SPListItem)
IPy 4 SPDdef FindManager(userName, ldapPath): import clr clr.AddReference("System.DirectoryServices") import System.DirectoryServices as ds adFolder = ds.DirectoryEntry(ldapPath) adSearcher = ds.DirectorySearcher(adFolder) adSearcher.SearchScope = ds.SearchScope.Subtree adSearcher.Filter = "(&(objectClass=user)(samaccountname=" + userName + "))" adResult = ds.SearchResult try: adResult = adSearcher.FindOne() return adResult.Properties["Manager"][0].Split(",")[0].Substring(3) except: return# the ldapPath structure may vary for you.mgr = FindManager("yourusername","LDAP://yourdomaincontroller/DC=yourdomain,DC=com")
IPy 4 SPD
Решение:1. Расширяем инструмент2. Обрабатываем и исполняем скрипты
IPy 4 SPD
Ответ:
Демо
TWIMILARМоё приложение с использованием анализа данных
Twimilar
Задача:Необходимо писать большое количество формул, которым требуется выразительная форма представления (псевдокод).
Twimilar
Решение:1. Создаём точку расширения2. Пишем функции на Python
Twimilar
Ответ:
Демо
GESTALT - DIYСоздаём Gestalt сами
Gestalt
• Клиентскую часть в веб-приложениях принято создавать на Javascript
• Большинство веб-разработчиков с огромным удовольствием бы отошли от этого правила и воспользовались своим любимым server-side языком.
GestaltDynamic Languages Runtime
Silverlight
HTML DOM
Gestalt
Задача:Сделать, чтобы заработало следующее:<script type="python">def func(): HtmlPage.Window.Alert("Hello world!") func()</script>
Gestalt
Решение:1. Читаем скрипт из Html2. Создаем Script Runtime3. Исполняем скрипт в Silverlight
Gestalt
Ответ:
Демо
REAL-LIFE DLR HOSTINGПримеры существующих приложений с DLR хостингом
Real-life DLR hosting
Real-life DLR hosting
Real-life DLR hosting
Работа на IronPython со всеми основными технологиями Microsoft
IronPython in Action
Materials
http://dlr.codeplex.com/http://blogs.msdn.com/seshadripv/default.aspxhttp://blogs.msdn.com/mmaly/default.aspxhttp://ironpython-urls.blogspot.com/http://blogs.msdn.com/hugunin/
Вопросыи
Ответы
Top Related