.Net: Использование .NET через COM #322376


#0 by The gray Cardinal
Классы .NET могут быть спрограммированы таким образом, что они будут доступны как COM-объекты, надо только их зарегистрировать специальной утилитой. Многие стандартные классы .NET Framework поддерживают такую возможность. Например, командная строка регистрации:   C:WINDOWSMicrosoft.NETFrameworkv2.0.50727>regasm System.dll   После этого на VBScript будет работать, например, такой код:   Set web = CreateObject("System.Net.WebClient") web.DownloadFile "http://mysite.com/", "c: empmyfile.htm"   Этот скрипт сохранит страничку "http://mysite.com/" в файл "c: empmyfile.htm". Кроме того, существует якобы универсальный COM-Wrapper для .NET: Правда, проекту тыщу лет вчера. По ссылке есть бинарник и исходник. Однако, бинарник (DLL) под Windows XP даже не регистрируется (выдаёт ошибку). Если пересобрать из исходника, уже регистрируется, но при любом вызове приводит к краху Windows Script Host.   Просьба к умелым пользователям MS Visual Studio: может, проект можно "починить"? Иметь такой универсальный COM-Wrapper для .NET было бы весьма удобно, имхо...
#1 by Кириллка
Если сорцы собрались и dll зарегалась, то это спасет отца русской демократии?
#2 by The gray Cardinal
Говорю же, не спасёт :) Если при любом вызове происходит крах Windows Script Host, кому нужен такой "компонент"?
#3 by Кириллка
какой код валит WSH?
#4 by The gray Cardinal
Да ЛЮБОЙ. Попытка вызова GetObject с этим моникером и валит.
#5 by Кириллка
перефразирую: можно ли получить пример самодостаточного кода, который завалит wsh?
#6 by The gray Cardinal
Дык по ссылке приведено, например:   Set stack = GetObject("dm.net:['mscorlib']System.Collections.Stack") stack.Push ".NET" stack.Push "Hello " MsgBox stack.Pop & stack.Pop   Если у тебя это не падает, please, выложи DLL на файлообменник.
#7 by Кириллка
Исследования показали: реализована эта штуковина под framework 1.x причем, похоже, пяткой левой ноги :) - запрашивается объект класса (в 1.x работает, в 2.x он уже другой и схема работы другая) и не проверяется на удачность создания. Т.е. поделка инициализируется "как бы нормально", но на самом деле уже должна лечь на этом этапе. А валится на самом использовании (код из примера), потому как AV (не создан экземпляр класса). Во framework 2.x поменялась схема работы: вместо ICorRuntimeHost нужно использовать ICLRRuntimeHost ну и правила работы с этим объектом сессно.
#8 by The gray Cardinal
А "починить" под 3-й framework нереально?
#9 by Кириллка
скорее всего, реально. Только Я про framework 3.x ничего не знаю.
#10 by The gray Cardinal
А что про него надо знать? C:WINDOWSMicrosoft.NETFrameworkv3.0 Могу только повторить услышанную где-то фразу, смысл которой понимаю очень слабо: "третий фреймворк использует рантайм второго" :))
#11 by Gepard
а 1С со ссылками не работает? просто делаю объект, без ошибок, а метод не работает... :(
#12 by Кириллка
по аналогии можно сказать, что "второй фреймворк использует рантайм первого", но как оказалось это не так :) Версию fw получить можно на ура, следовательно, можно разрулить алгоритмы, различных fw.
#13 by Кириллка
кстати, а приведи потенциальные области применения этого добра (только поконкретнее :) ), может я стану заинтересованным.
#14 by Gepard
+ - сможешь попробовать в VBScript ?
#15 by Gepard
ну, например,  XML парсер подключить
#16 by Gepard
+
#17 by The gray Cardinal
Область применения этого добра: использование мощи стандартных классов .NET в языках, которые понимают только COM, например, VBScript, Python, может даже 1С, и т.п. Отсутствие необходимости регистрировать каждую сборку, как показано в нулевом посте, а возможно, и использование классов .NET, которые вообще не спроектированы как видимые через COM. Пример закачки файла для VBScript приведён в нулевом посте. Если удастся задействовать таким способом (через COM) технологию рефлекшн, может, можно вообще чудес наворотить :) Говори яснее, что именно пробовать - тогда попробую.
#18 by Gepard
в библиотека и отчет для семерки, объект создается, но методов не видит... можно ли попробовать в VBScript те же методы?
#19 by Gepard
Все, разобрался... уже и в 77 работает :)))))))))
#20 by Gepard
сейчас выложу
#21 by Gepard
#22 by Gepard
Добавлено: 12. Подключение объектов из произвольных сборок .NET
#23 by Дуб
Вот нет бы код показал..
#24 by The gray Cardinal
Set gp = CreateObject("AddIn.Gepard") Без проблем, но по als'у не вижу, что надо делать дальше. Сейчас посмотрю .
#25 by Gepard
легко :)))) щас упадешь
#26 by Gepard
public object ПолучитьОбъект(string DLL, string ТипОбъекта)    {        ObjectHandle мойОбъект = Activator.CreateInstanceFrom(DLL, ТипОбъекта);        object мойОбъект1 = мойОбъект.Unwrap;        return мойОбъект1;    }
#27 by Gepard
там в комплекте отчет..
#28 by Gepard
ПулОбъектов = СоздатьОбъект("ПулОбъектов"); Web = ПулОбъектов.ПолучитьОбъект("C:WINDOWSMicrosoft.NETFrameworkv2.0.50727System.dll", "System.Net.WebClient");        Web.DownloadFile("http://www.forum.mista.ru/topic.php","C:123.php");
#29 by The gray Cardinal
И что? :) ПулОбъектов = СоздатьОбъект("ПулОбъектов"); Web = ПулОбъектов.ПолучитьОбъект("C:WINDOWSMicrosoft.NETFrameworkv2.0.50727System.dll", "System.Net.WebClient"); Web.DownloadFile("http://www.forum.mista.ru/topic.php","C:123.php"); Как я это на VBScript сделаю? В als "ПолучитьОбъект" не вижу, да и русские методы в VBScript не покатят.
#30 by Gepard
сейчас добавлю английский объект
#31 by Gepard
+ залил в Синоним ПулОбъектов - ObjectFerm Синоним ПолучитьОбъект - GetObject
#32 by Gepard
поменял механизм чуть... и залил опять
#33 by Gepard
Код для Set OF= CreateObject("ObjectFerm") Set web = OF.GetObject("C:WINDOWSMicrosoft.NETFrameworkv2.0.50727System.dll", "System.Net.WebClient") web.DownloadFile "http://mysite.com/", "c: empmyfile.htm"
#34 by Gepard
хотя может я метод не так вызываю GetObject
#35 by Gepard
Завел по ВК отдельную ветку
#36 by Кириллка
#37 by The gray Cardinal
Спасибо большое, вечером обязательно посмотрю. Сейчас у меня IP-шник для рапиды сильно некузявый :)))
#38 by Gepard
а не получилось подключить?
#39 by The gray Cardinal
Неа, не получается... При регистрации:   Ошибка при вызове LoadLibrary("clrmonsrv.dll")  - Неверная попытка доступа к адресу памяти.
#40 by Кириллка
посмотри зависимости через Dependency walker
#41 by The gray Cardinal
Посмотрел. Нашёл какую-то dwmapi.dll ("Microsoft Desktop Window Manager API"). Скачал её из инета - всё зарегистрировалось и работает. Потом убрал dwmapi.dll, перерегистрировал сам врапёр - всё опять работает :))) Вчера вечером , однако, пробовал на другой машине (ведь тоже Windows XP) - там чётко было то, о чём я и написал. Вобщем, чудеса (а может, я где-то напортачил, хотя и не пойму, где тут вообще можно напортачить). Вобщем, спасибо большое, пашет!
#42 by The gray Cardinal
Кстати, ты просто пересобрал, или ещё какие магические пассы делал?
#43 by Кириллка
dwmapi.dll - у меня ее тоже нигде нет. второе.
#44 by Кириллка
а DownloadFile у тебя завелся?
#45 by The gray Cardinal
Нет. Если честно, то я немного в растерянности :)) Я не совсем понимаю, как работает моникер, потому что например вот такая строка не работает:   dm.net:['System.Windows.Forms']System.Windows.Forms.Form   "Отсутствует объект, соответствующий специальному имени" И кстати, с какой именно версией .NET это работает в каждом конкретном случае?
#46 by The gray Cardinal
up
#47 by Кириллка
Полез разбираться с моникерами, но попал на один блог и тупо читаю. Читать блог интересно. Кстати, на этом чуть не сошел с ума.
#48 by Kalambur
это называется так:"Если хочешь, чтобы чел сошел с ума, дай сцылку "
#49 by The gray Cardinal
up
#50 by Кириллка
Судя по коду и описанию моникера, в квадратных скобках должна быть указан сборка (assembly), а потом класс. Эта сборка должна быть в глобальном кеше. Вот у себя в глобальном кеше (C:WINNTassembly) я вижу mscorlib - оно и работает. Может нужно в этом направлении думать?
#51 by The gray Cardinal
У себя в глобальном кеше (C:WINDOWSassembly) я вижу System.Windows.Forms. И тем не менее выдает "Отсутствует объект, соответствующий специальному имени".
#52 by The gray Cardinal
+ Фактически mscorlib находится тут: c:WINDOWSassemblyGAC_32 А вот System.Windows.Forms находится тут: c:WINDOWSassemblyGAC_MSIL Может, моникер ищет только в GAC_32?
#53 by Gepard
ссылка нерабочая, воспользуйтесь
#54 by Кириллка
не понятно, где ищет, но используется дотнетовский АПИ: AppDomain.CreateInstance(String, String, Object[]) (точнее его unmanaged эквивалент _AppDomain.CreateInstance) с параметрами: Сборка, Тип, СозданныйОбъект.
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С