Переключение на Главную Страницу Страницы: [1] 2 3 ... 6 ОтправитьПечать
Очень популярная тема (более 25 ответов) v7CLR: ВК для работы с .NET-типами без CCW (число прочтений - 58173 )
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
v7CLR: ВК для работы с .NET-типами без CCW
11. Мая 2008 :: 21:47
Печать  
Внешняя компонента v7CLR.dll позволяет создавать в 1с объекты .NET(CLR) и предоставляет доступ к их свойствам и методам.
ВК написана по технологии Rainbow и не требует регистрации в реестре.

Отличительные особенности:
  • работает напрямую с CLR, что в некоторых случаях в несколько раз быстрее чем через CCW. т.е. отсутствуют промужуточные прокладки между 1С и CLR (BLContext -> IDispatch -> CCW -> CLR)
  • позволяет создавать объекты CLR-классов незарегистрированных для COM-Interop, т.е. не нужно выполнять regasm для используемых сборок
  • позволяет создавать объекты CLR-классов помеченных атрибутом ComVisible(false), что невозможно при использовании CLR-классов через COM-Callable Wrapper(CCW)
  • позволяет вызывать перегруженные методы CLR-классов, что также невозможно при использовании CCW
  • позволяет создавать объекты классов, не имеющих публичного конструктора по умолчанию

ВК перехватывает вызов системной функции СоздатьОбъект и если первым символом в имени
типа является "!", создает объект CLR-типа.
Для классов, находящихся в mscorlib.dll можно указывать только имя типа(включая все пространства имен).
Для остальных классов должно использоваться AssemblyQualifiedName  msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname.aspx.
Например так
Код
Выбрать все
Массив=СоздатьОбъект("!System.Collections.ArrayList");
Пингер=СоздатьОбъект("!System.Net.NetworkInformation.Ping, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
 


Для перегруженных методов ВК использует переименование методов, по следующей схеме:
  • перегруженные методы упорядочиваются по количеству параметров
  • для перегруженных методов с одинаковым количеством параметров разных типов порядок не определен
  • имя первого после упорядочивания метода остается неизменным
  • ко всем последующим методам добавляется номер начиная с 2

Внимание! Имена всех методов и свойств регистрозависимы.

Во вложении сама компонента, обработка с тестами и кратким примером использования и краткое описание.

Сравнение скорости работы v7CLR и CCW: Цитата:
Установка свойства CCW: 425 мс
Установка свойства v7CLR: 54 мс
Чтение свойства CCW: 406 мс
Чтение свойства v7CLR: 49 мс
Вызов метода CCW: 392 мс
Вызов метода v7CLR: 102 мс

Тесты выполнялись в цикле 10 000 раз.
Для тестов были использованы простейшие свойства и методы, чтобы время выполнения managed-кода оказывало меньшее влияние на измерения.

Планы по развитию:
  • Реализовать фабрику классов, при помощи которой можно будет создавать объекты типов, не имеющих публичного конструктора по умолчанию.
  • реализовать работу с value-типами и перечислениями
  • работа со статическими методами абстрактных классов.
  • работа с событиями
  • возможно реализация CLR-оберток для некоторых внутренних классов 1с, чтобы упростить написание CLR-плагинов к 1С


скачать компоненту можно тут: http://code.google.com/p/v7clr/
« Последняя редакция: 22. Сентября 2008 :: 08:51 - steban »  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: v7CLR: ВК для работы с .NET-типами без CCW
Ответ #1 - 12. Мая 2008 :: 02:50
Печать  
Супер!
  
Наверх
ICQ  
IP записан
 
vivm
Full Member
***
Отсутствует



Сообщений: 159
Местоположение: Новосибирск
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: v7CLR: ВК для работы с .NET-типами без CCW
Ответ #2 - 12. Мая 2008 :: 03:26
Печать  
То что надо! А что делать, что бы работало?

Ст2=СоздатьОбъект("!System.Collections.ArrayList");
{D:\DATABASE\FLAND1\EXTFORMS\1CPP\CLR.ERT(48)}: Неудачная попытка создания объекта (!System.Collections.ArrayList)
Пингер=СоздатьОбъект("!System.Net.NetworkInformation.Ping, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
{D:\DATABASE\FLAND1\EXTFORMS\1CPP\CLR.ERT(62)}: Неудачная попытка создания объекта (!System.Net.NetworkInformation.Ping, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)

попробовал на 2-х компьютерах, 2003 и XP, результат одинаков.
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: v7CLR: ВК для работы с .NET-типами без CCW
Ответ #3 - 12. Мая 2008 :: 03:47
Печать  
А загружать компоненту пробовал?
  
Наверх
ICQ  
IP записан
 
vivm
Full Member
***
Отсутствует



Сообщений: 159
Местоположение: Новосибирск
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: v7CLR: ВК для работы с .NET-типами без CCW
Ответ #4 - 12. Мая 2008 :: 03:53
Печать  
Попробовал  Очень довольный Получилось  Смех

понадеялся на то что по умолчанию все в обработке должно загружаться
  
Наверх
ICQ  
IP записан
 
Igor-bts
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 103
Зарегистрирован: 14. Июля 2006
Re: v7CLR: ВК для работы с .NET-типами без CCW
Ответ #5 - 12. Мая 2008 :: 06:22
Печать  
Если у объекты CLR конструктор c параметром, как будут создаваться
Как вариант:
Загрузчик = СоздатьОбъект("addin.ЗагрузчикCLR");
ОбъектCLR = Загрузчик.СоздатьОбъект("!System.Collections.ArrayList", парам1, парам2, парам3,....);
  
Наверх
ICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: v7CLR: ВК для работы с .NET-типами без CCW
Ответ #6 - 12. Мая 2008 :: 12:48
Печать  
Igor-bts писал(а) 12. Мая 2008 :: 06:22:
Загрузчик = СоздатьОбъект("addin.ЗагрузчикCLR");
ОбъектCLR = Загрузчик.СоздатьОбъект("!System.Collections.ArrayList", парам1, парам2, парам3,....);

Да, что-то вроде такого и будет.
Только без всяких там "addin", т.к. это ВК Rainbow-типа Улыбка
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: v7CLR: ВК для работы с .NET-типами без CCW
Ответ #7 - 12. Мая 2008 :: 14:21
Печать  
Ачуметь!
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: v7CLR: ВК для работы с .NET-типами без CCW
Ответ #8 - 12. Мая 2008 :: 19:26
Печать  
В компоненте реализован класс CLRФабрика (синоним CLRFactory) с методом "Создать" (синоним "CreateInstance").

Пример использования:
Код
Выбрать все
Ф=СоздатьОбъект("CLRFactory");
инфо=Ф.Создать("System.IO.DriveInfo","c");
Сообщить("На диске C: свободно "+инфо.AvailableFreeSpace+" байт");
 


Качать в заглавном посте ветки.

Пока реализована передача параметров конструкторов типов Int32, String и любых ref-типов (предварительно созданных).
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: v7CLR: ВК для работы с .NET-типами без CCW
Ответ #9 - 13. Мая 2008 :: 11:40
Печать  
По данным clr.ert : "На диске C: свободно 1356083200 байт"

Смотрю в проводнике в свойствах диска С: Free Space 22 830 858 240 bytes,    21,2 GB

Где собака порылась?

ЗЫ. Для справки: на компе стоит ХР Pro Eng SP3, все фремвоки с апдейтами, и всё прочее, что доступно через интерактивное виндоуз упдатэ.
« Последняя редакция: 14. Мая 2008 :: 14:34 - Kapet »  
Наверх
ICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: v7CLR: ВК для работы с .NET-типами без CCW
Ответ #10 - 13. Мая 2008 :: 18:52
Печать  
Kapet писал(а) 13. Мая 2008 :: 11:40:
Где собака порылась?

В преобразовании Int64 в CNumeric.
Глюк налицо.

Задумался....
Ушел писать юнит-тесты
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: v7CLR: ВК для работы с .NET-типами без CCW
Ответ #11 - 15. Мая 2008 :: 13:26
Печать  
Реализована работа с value-типами (вызов методов, чтение свойств).
Установка свойств и выполнение методов, изменяющих состояние объекта тоже возможны, только будут выполняться с копией объекта, которая потом будет уничтожена при размотке стека. Почему так, объяснять не буду. Это не баг - это фича. Если установка свойств value-типов кому-нибудь когда-нибудь понадобится, взамен могу сделать установку protected полей.

Исправлено неверное преобразование некоторых типов в CValue.

Написаны юнит-тесты на существующий функционал.
Работоспособность подтверждена тестами.

чуть было не порушил всё, когда делал работу с value-типами.
TDD рулит  Подмигивание
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: v7CLR: ВК для работы с .NET-типами без CCW
Ответ #12 - 15. Мая 2008 :: 14:02
Печать  
Kapet писал(а) 13. Мая 2008 :: 11:40:
По данным clr.ert : "На диске C: свободно 1356083200 байт"
Смотрю в проводнике в свойствах диска С: Free Space 22 830 858 240 bytes,    21,2 GB

Спасибо! Теперь свободное место на диске определяется правильно.
  
Наверх
ICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: v7CLR: ВК для работы с .NET-типами без CCW
Ответ #13 - 16. Мая 2008 :: 14:59
Печать  
Реализована работа с абстрактными классами и классами, не имеющими публичных конструкторов.
Если производится попытка создать абстрактный класс через СоздатьОбъект или через фабрику, то объект не создается, но в 1с возвращается обертка, позволяющая вызывать методы.
В связи с этим отпала необходимость реализовывать в компоненте что-то специальное для работы с перечислениями.

Попробую пояснить кодом.
Код
Выбрать все
ЗагрузитьВнешнююКомпоненту("v7CLR.dll");
Factory=СоздатьОбъект("CLRFactory");
Types=Factory.CreateInstance("System.Type"); // абстрактный класс
Enums=Factory.CreateInstance("System.Enum");
CreateMode=Enums.Parse(Types.GetType3("System.IO.FileMode"),"Create");
//System.IO.FileMode - тип-перечиление
//System.IO.FileMode.Create - значение перечисления
fstream=Factory.Создать("System.IO.FileStream","c:\test.bin",CreateMode);
bw=Factory.CreateInstance("System.IO.BinaryWriter",fstream);
Нач=_GetPerformanceCounter();
Для Сч=1 По 10000 Цикл
	bw.Write9(65535);
КонецЦикла;
Сообщить("файл записан: "+(_GetPerformanceCounter()-Нач)+" мс");
bw.Flush();
bw.Close();
 

  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: v7CLR: ВК для работы с .NET-типами без CCW
Ответ #14 - 16. Мая 2008 :: 15:04
Печать  
steban писал(а) 11. Мая 2008 :: 21:47:
Планы по развитию:
  • Реализовать фабрику классов, при помощи которой можно будет создавать объекты типов, не имеющих публичного конструктора по умолчанию.
  • реализовать работу с value-типами и перечислениями
  • работа со статическими методами абстрактных классов.
  • работа с событиями
  • возможно реализация CLR-оберток для некоторых внутренних классов 1с, чтобы упростить написание CLR-плагинов к 1С

Для работы с событиями интерфейс видится следующий:
В классы, имеющие события, добавляем метод ПривязатьСобытияККонтексту (BindEventsToContext) с 2-мя параметрами:
- Контекст в котором реализованы процедуры-обработчики (контекст формы или КОП)
- префикс имени для процедур-обработчиков

есть возражения?
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 ... 6
ОтправитьПечать