Имя: Пароль:
1C
 
1С 8.2 зависает при подключении dll с опцией /CLR
0 Elisy
 
14.12.10
08:34
Добрый день,
столкнулся с проблемой зависания CLR-библиотеки при подключении ее из 1С 8.2.
Многие слышали о выходе новой версии 1С:Предприятие 8.2 и знают о планах отказаться от поддержки 8.1 в первом квартале 2011 года.

В версии 8.2 1С анонсировала новый способ написания внешних компонент 1С с использованием так называемого Native API. Самое интересное, что на C# предложенный подход реализовать невозможно, а реализация Native API на VC++/CLI теоретически возможна, но при попытке подключения DLL, скомпилированных с опцией /CLR, происходит зависание 1С (версия 8.2.13.202).

Простейший способ воспроизвести проблему зависания: включить опцию /CLR на проект-пример от 1С про таймер NativeAPI. Зазиповать DLL вместе с файлом MANIFEST.xml в макет кофигурации 1С 8.2 и выполнить следующий код на форме:

&НаКлиенте
Процедура TestNativeApi(Команда)
   УстановитьВнешнююКомпоненту("ОбщийМакет.ElisyNetBridge4");
   Сообщить(ПодключитьВнешнююКомпоненту("ОбщийМакет.ElisyNetBridge4", "ElisyNetBridge", ТипВнешнейКомпоненты.Native));    
   TestNativeApiServer();
КонецПроцедуры

&НаСервере
Процедура TestNativeApiServer()
   Сообщить(ПодключитьВнешнююКомпоненту("ОбщийМакет.ElisyNetBridge4", "ElisyNetBridge", ТипВнешнейКомпоненты.Native));    
КонецПроцедуры

Комментируя код, относящийся к клиенту или серверу, можно понять, что проблема характерна как для клиента, так и для сервера.
Проблема серьезная для многих, так как она блокирует использование Native API ВК, написанных с применением .Net, на 1С.
1 loh_pedalny
 
14.12.10
09:41
Так если я не ошибаюсь, Native API кк раз и сделали для того, чтобы не тащить паровоз из .NET и COM'а.
Не?
2 Elisy
 
14.12.10
09:52
(1) Native API сделали для возможности писать ВК на Linux
3 acsent
 
14.12.10
11:15
В 1С отписал?
4 Elisy
 
14.12.10
12:06
:) А 1С прислушается?
5 Elisy
 
17.12.10
08:11
Интересный вопрос: почему новая технология Native API уступает старой технологии COM отсутствием доступа к методам глобального контекста (AppDispatch)? Ведь все новое должно быть лучше старого...
6 Кирпич
 
17.12.10
08:56
(5) Я думаю, потому что AppDispatch там не нужен. Вот тебе зачем он нужен?
7 Elisy
 
17.12.10
09:50
(6) AppDispatch - это доступ к более сотни функций 1С. Я, например, в 8.1 перевожу произвольный макет в byte[] используя вызов Base64String и обратный System.Convert.FromBase64String.
8 Кирпич
 
17.12.10
10:34
(0)"а реализация Native API на VC++/CLI теоретически возможна"

.NET наконец то стал компилить DLL которые понимают программы написанные не на .NET? Или этот геморрой ещё не вырезали?
9 loh_pedalny
 
17.12.10
11:17
(7)Интересно, а в веб-клиенте ты чей AppDispatch ожидаешь получить?
10 DmitrO
 
17.12.10
11:31
(2)ну это, мягко говоря, не правда
Native API сделали для того чтобы компоненты можно было писать такие компоненты, которые могут работать везде где работает код 1С, на обычном клиенте, на сервере, web-браузере.
Соответственно и в среде разных ОС Windows и Linux, т.к. сервера и браузеры могут работать на Linux.
В Linux нет COM, соответственно Native компоненты COM не используют.
Соответственно нет COM - нет и AppDispatch.

Все просто у них. :)
11 Elisy
 
17.12.10
12:26
(8) Вы удивитесь, но C++ стал поддерживать формат .Net с 2003 года. Более того, видится усилия Microsoft от отказа от C++ в будущих Visual Studio.
12 Elisy
 
17.12.10
12:31
(9) В веб-клиенте я надеюсь увидить пространство имен JScript Web.GeneralContext. Меня это устроит - в нем представлены все методы глобального контекста.
13 Кирпич
 
17.12.10
12:34
(11) Ды накой тут формат .NET, если нужно в .NET сделать dll обычную, не CLR
14 Кирпич
 
17.12.10
12:35
+11 1C:Предприятие в NativeAPI работает только с обычной dll
15 Elisy
 
17.12.10
12:41
(10) Это вранье. Native API не сможет работать на Internet Explorer (распространенный веб-клиент) - он ничего кроме ActiveX и COM не воспринимает. Насколько вы понимаете, Native API - это определения вида extern "C" long GetClassObject, которые с COM ничего общего не имеют. Если вы посмотрите в реализацию ВК на Internet Explorer, вы увидете "new ActiveXObject(...)", все обращения через IDispatch.
В Linux нет COM, однако Native API изобилует определениями из COM  - достаточно посмотреть файл types.h - ничего лучше COM-определений 1С не придумала даже для linux: struct _tVariant, #define TV_I8, #define TV_INT_PTR, enum ENUMVAR
Гипотетических пользователей Linux не так уж и много.
16 Elisy
 
17.12.10
12:44
(14) Native API не могут работать с Internet Explorer по определению, он признает только COM. см. (15)
17 Кирпич
 
17.12.10
12:53
(14) Я про Internet Explorer ничо и не спрашивал. Я говорю, что проблема в том, что .NET не делает обычных DLL, которые требует NativeAPI. В этом и проблема.
18 loh_pedalny
 
17.12.10
12:57
(15)А может Вам заняться написанием NetBridge для навижн?
Все условия:
1. работает только на винде
2. родная поддержка .нет
3. родной СОМ
3. никаких "гипотетических пользователей линукс"
19 Elisy
 
17.12.10
13:19
(18) :) У NetBridge далеко идущие планы - для англоговорящих 1С-разработчиков через сайт www.1centerprise.com. Это основа понятия 1C.Net:Предприятие. Рано или поздно с помощью компании 1С или без помощи компании 1С иностранцы оценят 1C:Enterprise со всеми ее недостатками. DotNet - для иностранцев важен. Ну а пока в России, а самое интересное и на Украине, ценят NetBridge, мы постараемся для своих пользователей сделать максимум, поставив на уши разработчиков 1С через тех.поддержку. Найдя обходные пути, но сборки .Net наших пользователей будут работать, начиная с версии 7.7 и кончая 8.2.
20 Кирпич
 
17.12.10
13:24
(19) Фанатик.
21 Elisy
 
17.12.10
13:26
(18) Почему я выразился "гипотетические пользователи Linux". 1С - традиционно Windows-приложение. Если клиент, то традиционно Windows, если СУБД, то традиционно MSSQL. Сколько у вас на памяти чистых Linux-клиентов? У меня ни одного. Даже на западе (в Италии), где преобладает Linux, мы собирали статистику. В средней компании 2 сервера: Windows и Linux, а клиенты все Windows.
На кого нацелены все Linux-фичи 1C?
22 DmitrO
 
17.12.10
13:59
(15) struct _tVariant
почемы ты решил что определение этой структуры имеет какое-то отношение к COM?
Потому что она имеет похожее название и назначение со структурой VARIANT применяющейся в COM?

И то что объект Native ВК определяется с помощью нескольких интерфейсов тоже к СОМ отношения не имеет.
Это всего лишь технология COM ТОЖЕ использует интерфейсы. В COM все интерфейсы должны быть унаследованы от IUnknown, в Native ВК интерфейсов это не так.

Да там применяются интерфейсы как элементы языка С++, но COM тут непричем.
23 DmitrO
 
17.12.10
14:11
Да и вообще, вам нужен .NET это как бы определяет платформу только как Windows, а Native задумано как кросплатформенное решение.
Зачем вам Native? Вам COM компонент вроде как достаточно, разьве нет?
24 DmitrO
 
17.12.10
14:20
Насамом деле, то что в Linux нет COM (или аналогичного общего универсального механизма) это не фишка его - это его беда.

Например одно из ярких проявлений этой беды: если сервер 1С на linux, то регламентными заданиями, которые работают на сервере, нельзя организовать обмен данными между базами традиционными средствами: ComConnetor-а нету..
И нет никакого аналогичного средства доступа к данным базы.
25 Elisy
 
17.12.10
14:23
(22) Да потому что в клиенте 8.2 осталась поддержка COM-интерфейсов ВК, совместимых с 7.7. Вы думаете, что в 1С было реализовано 2 принципиально разных механизма работы с ВК? Я сомневаюсь. В подтверждение моих слов Internet Explorer, который не вписывается в технологию Native API - это так называемый "финт ушами" через COM. Нигде не сказано в документации о интерфейсе IAddInServiceEx для MSIE.
26 DmitrO
 
17.12.10
14:25
IAddInServiceEx это что?
27 DmitrO
 
17.12.10
14:27
>>Вы думаете, что в 1С было реализовано 2 принципиально разных механизма работы с ВК? Я сомневаюсь.
Тут нечего сомневаться это написано в документации.
28 Elisy
 
17.12.10
14:35
(26) IAddInServiceEx - это бомба Native API, которая не описана в документации - это интерфейс работы ВК на IE, описанный в примере AddInIE->AddInIE.idl как

interface IAddInServiceEx : IDispatch{

   [id(1), helpstring("method init")] HRESULT init([in] IDispatch* listener);
   [id(2), helpstring("method loadAddIn")] HRESULT loadAddIn([in] BSTR name, [in] BSTR url, [in] SHORT type);
   [id(3), helpstring("method createInstance")] HRESULT createInstance([in] BSTR name, [out,retval] IAddInSite** ppvObject);
   [id(4), helpstring("method releaseObject")] HRESULT releaseObject([in] IUnknown* src);
   [id(5), helpstring("method setLocale")] HRESULT setLocale([in] BSTR locale);
};
29 Elisy
 
17.12.10
14:38
(28) Самое интересное - этот интерфейс действующий, достаточно загнать IE-dll в CAB, подписать и вызвать ВК через ПодключитьВнешнююКомпоненту("","",..) из IE.
30 DmitrO
 
17.12.10
14:43
На счет IE и механизма загрузки компоненты в веб-клиентах вцелом - незнаю не смотрел не щупал..

Но механизм мне видится мне таким: сами браузеры никогда в жизни не будут цеплять простые dll полученные с web-сервера это не безопасно вообще-то, но там можно применить проверку каких-либо удостоверений.

Для загрузки компонент например в IE может использоваться некий AtiveX получаемый с web-сервера под isapi расширением от 1С, как бы загрузчик Native компонент, он будет удостовереный сертификатом (его авторы - 1C), поэтому встанет по тихому, без вопросов.
А вот грузить саму Native компоненту уже будет он, и предоставлять интерфейс объекта будет он.

IAddInServiceEx - кстати не его ли интерфейс? по имени весьма подходит.
31 DmitrO
 
17.12.10
14:54
Ну вот чо, именно так у них и сделано.

А он и не дожен быть описан к документации. Это часть реализации веб-клиента. Причем возможно что именно такая реализация для IE. Для хрома или оперы под которые работают под linux будет другая.
Для эпполовского safary, например, может быть когда нить напишут третью.
Вот и все
32 Кирпич
 
17.12.10
15:01
(31) Грамотно изложил. Теперь ждем прояснения в голове нашего юного гения...
33 DmitrO
 
17.12.10
15:02
В 8.2 COM компоненты кстати тоже нельзя загрузить на сервере как и в 8.1.
Странные они.. COM компоненты нельзя, но зато запросто можно просто COM объекты, удивительно!
34 DmitrO
 
17.12.10
15:07
Это, блин, native API теперь каждый к своей родной тумбочке притянуть хочет :)
..кто-то к .NET, а кто-то к Delphi, да ведь Кирпич ;)
35 Кирпич
 
17.12.10
15:08
(34) Ага. Только оно как то пока нафиг ненужно.
36 DmitrO
 
17.12.10
15:09
..в этом нет ничего плохого, конечно..
37 DmitrO
 
17.12.10
15:12
(35) угу, вот снизойдет на 1С божья благодать, сделают они как-нибудь доступ к родным объектам 1С из компоненты - вот тогда попрет у всех. :)
38 Кирпич
 
17.12.10
15:16
(37) :)))
Ну тогда народ вабще не станет изучать родной язык 1С, все будут на сях обработки строчить.
А для Elisy сделают отдельный брыдш на .NET, в качестве акта доброй воли.
39 DmitrO
 
17.12.10
15:20
Да он сам себе сделает, я честно говоря не верю что dll с /clr просто так вот не грузится..
надо искать причину.
40 loh_pedalny
 
17.12.10
16:51
(33)А ты попробуй. только права учетке сервера задери по максимуму, дабы зарегить СОМ смог.
41 Elisy
 
18.12.10
09:58
(30) О спец-библиотеке для IE от 1С речи пока не идет. Хотя, полностью согласен, так было бы грамотнее всего сделать и такое решение гармонично бы вписалось в подход Native API. Не нужно было бы напрягать разработчиков частными подходами.

Сейчас для IE с сервера получают .cab-файл, который устанавливается средствами Windows с регистрацией всех библиотек, если нужно.
Далее идет создание объекта с именем в файле MANIFEST.xml через Web.AddIn.Adaptor=new ActiveXObject(<name>); и последовательный вызов у объекта методов интерфейса IAddInServiceEx через IDispatch.
42 Elisy
 
18.12.10
10:02
(39) Не у всех происходит зависание C++/CLR:
http://forum.infostart.ru/forum24/topic37115/message406055/#message406055
Теперь я думаю, в чем проблема: Windows 7 виновата или установленный .Net framework 4.0.
43 loh_pedalny
 
18.12.10
20:59
(42)блин... вот смотрю и думаю....
А как предполагается борьба с различными версиями .Нет у пользователя?
ведь если ВК попадет к юзеру из макетов, то далеко не факт, что у него уже точно стоит .Нет4.
Ответ есть на этот вопрос?
44 loh_pedalny
 
18.12.10
21:00
+(42)а на W2k8Core и вообще .Нет по умолчанию не ставится...
45 orefkov
 
18.12.10
23:28
NET'у - нет!!!
Православный С/C++ наш выбор. Будет работать везде и всегда.
46 Elisy
 
20.12.10
06:31
(43) 1С просто не сможет загрузить ВК - в коде на этом этапе можно сделать проверку.
47 Elisy
 
20.12.10
06:34
(45) У меня такое же было отношение к .Net, пока один проект не заставили итальянцы сделать на смешанном коде. При переписывании С++ (MFC) средствами .Net мы получили на 50% экономии кода. На столько же меньше ошибок и время на отладку. Получили сотни дополнительных .Net-контролов для интерфейса пользователя, а не 10-20, которые можно добавить на форму через RC-файл. Плюс меньше проблем с итальяно/английском локализацией.
48 DmitrO
 
20.12.10
10:56
(31)>>Для эпполовского safary, например, может быть когда нить напишут третью.

Цитата:
Технологическая платформа 1С:Предприятия 8.2. Версия 8.2.13.202
Поддержка работы веб-клиента в браузерах "Safari" и "Google Chrome" включена в данную версию для целей бета-тестирования.

Так что, уже.. но это, возможно, это для того сафари который на Windows работает, а не на МакОС, хотя надо проверять.

(43)будут расставлять .Нет4 через групповые политики, какие проблемы-то? Суть в том, что .Net это только Windows.
49 Serginio1
 
20.12.10
10:58
Раз уж сюда зашел продублирую
Странно, что натив код может обнаружить сейв код как нативный. Видно я давно Рихтера не читал, но даже загрузка сейв кода происходит через СОМ ком обертку. Во первых непонятно зачем использовать NativeAPI там где можно работать через ком напрямую?
ПодключитьВнешнююКомпоненту(<Местоположение>, <Имя>, <Тип>)
NativeAPI это прежде всего для Линукса.
50 Elisy
 
20.12.10
13:14
Если кому-нибудь интересно, написал свою версию вариантов подключения внешних компонентов в 1С 8.2 на примере .Net Bridge с учетом обходных путей. Полезно будет для других C#-разработчиков ВК.

Способы подключения внешнего компонента зависят от режима работы (сервер, толстый, тонкий или веб клиент).

Самым простым способом подключения считается подключение в качестве Com-объекта. Такой вызов возможен во всех клиентах 1С 8.2 и версиях 1С, включая версии до 8.2. При работе с веб-клиентом может потребоваться включение настройки "Разрешить сценарии".

  1. net = Новый COMОбъект("Elisy.NetBridge");

Инициализация компонента Elisy.NetBridge.dll из 1С (например, в тонком клиенте) происходит следующим образом с использованием COM ProgID:

  1. ПодключитьВнешнююКомпоненту("Elisy.NetBridge");
  2. AddIn = Новый("AddIn.ElisyNetBridge");
  3. net = AddIn.GetNet();

Для некоторых случаев (например, в веб-браузере) этот вызов может происходить из макета с ZIP-содержимым таким образом:

  1. ПодключитьВнешнююКомпоненту("ОбщийМакет.ElisyNetBridge4", "ElisyNetBridge", ТипВнешнейКомпоненты.Native);
  2. AddIn = Новый("AddIn.ElisyNetBridge");
  3. net = AddIn.GetNet();

или нерекомендуемый вызов по пути к файлу, оставшийся для обратной совместимостьи с предыдущими версиями 1С:Предприятие:

  1. ЗагрузитьВнешнююКомпоненту("C:\Program Files\Elisy .Net Bridge\Elisy.NetBridge.dll");
  2. AddIn = Новый("AddIn.ElisyNetBridge");
  3. net = AddIn.GetNet();


Примечание: На некоторых компьютерах под управлением Windows 7/Vista с включенным UAC при подключении Elisy .Net Bridge наблюдаются странные проблемы. Например, вызов Новый COMОбъект("Elisy.NetBridge") выдает ошибку «Класс не зарегистрирован» или вызов ПодключитьВнешнююКомпоненту("Elisy.NetBridge") возвращает ложь, хотя в реестре можно увидеть соответствующую запись. Решаются проблемы удалением инсталляции Elisy .Net Bridge и установкой этой же инсталляции с правами администратора или запуском тонкого клиента 1С или веб-браузера с правами администратора.

Допустим вариант подключения .Net Bridge через описание на Html-странице с обращением к свойствам и методам средствами JScript. Такой вариант подходит для тонкого и толстого клиента.

  1. <object id="ElisyNetBridge" classid="clsid:9B29E1C7-4D99-4AA9-B5AB-0B0608A94F76" style="visibility: hidden;">
  2. </object>
  3. <script type="text/jscript">
  4. net = document.getElementById("ElisyNetBridge");
  5. </script>
51 Serginio1
 
21.12.10
11:12
(45) Ну нативу понемногу приходит конец. Новые операционки напрополую используют Save платформы, а Windows Phone не дает SDK для натива. Так смотришь и 1С перейдет на ЯВУ или .Net. Не зря майкрософт линукс подкупает себе.
(0) Вот простенький врайнер Net объектов в COM
Кстати вот врайпер Net объектов в COM http://efreedom.com/Question/1-1070458/IReflect-DispId
52 DmitrO
 
21.12.10
11:20
гыгы, чорта с два :)
блажен, кто верует..
53 Serginio1
 
21.12.10
11:24
(52) Увы такова тенденция, для нас атеистов "вера" чуждое явление.
54 Serginio1
 
21.12.10
12:10
+(51) Единствено, что нужно добавить обертку вокруг OUT и ref параметров
55 Elisy
 
21.12.10
13:57
Только что пришло сообщение от 1С:
Цитирую:
"Просто включить опцию компилятора /clr недостаточно.
Т.к. платформа взаимодействует с неуправляемым кодом, то дополнительно нужно применять директивы #pragma managed(push, off) #pragma managed(pop) #pragma unmanaged Это объясняется несовпадением C/C++ ABI с ABI управляемого кода.

Так,в файле AddInNative.cpp из примера, перед функцией long GetClassObject(const WCHAR_T* wsName, IComponentBase** pInterface) нужно добавить директиву #pragma unmanaged

в файле AddInNative.h, после #define __ADDINNATIVE_H__ нужно добавить #pragma managed(push, off), а перед #endif //__ADDINNATIVE_H__ #pragma managed(pop)
"
Постараюсь побыстрее проверить
56 Elisy
 
22.12.10
12:18
(56) Работает. Принцип такой, что хотя весь проект и компилируется с опцией CLR, но на модуль AddInNative эта настройка не распространяется. Как развивать еще не думал, но этого достаточно, чтобы цивилизованно выдавать сообщение при попытке подключения по Native API: "Native API не поддерживается!" :)
57 Кирпич
 
22.12.10
12:31
(56) Можешь сильно не распинаться, умные люди про это здесь уже давно написали.
http://www.rsdn.ru/article/dotnet/mcpp.xml
58 Serginio1
 
22.12.10
13:20
(56) Зачем писать NativeApi если можно использоват СОМ ВК?
ПодключитьВнешнююКомпоненту("ОбщийМакет.ElisyNetBridge4", "ElisyNetBridge", ТипВнешнейКомпоненты.Com);
Или я что то не догоняю?
Так или иначе шлюз между нативом и сейвом это Com
59 Elisy
 
22.12.10
13:24
(57) Мельком взглянул - синтаксис старый, значит и статья скорее всего устарела.
60 Elisy
 
22.12.10
13:29
(56) Подключение с использованием COM ВК доступно только на тонком клиенте, сервер признает только Native API. COM ВК сейчас запускать нельзя.
61 loh_pedalny
 
22.12.10
13:36
(60)Это кто тебе сказал?
62 Кирпич
 
22.12.10
13:39
(59) Ты очень крут. Мельком по синтаксису и сразу всё понял.
А я дурак на дату публикации смотрю.
Очень, очень крут.
63 Serginio1
 
22.12.10
13:57
(59) На сервере нельзя ПодключитьВнешнююКомпоненту(<ИдентификаторОбъекта>)
а
ПодключитьВнешнююКомпоненту(<Местоположение>, <Имя>, <Тип>)
Параметры:

<Местоположение> (обязательный)

Тип: Строка. Местоположение внешней компоненты.
В качестве местоположения может использоваться:
путь к файлу внешней компоненты в файловой системе (недоступно на веб-клиенте) (не ZIP-архив);
полное имя макета, хранящего двоичные данные или ZIP-архив;
URL к внешней комопненте, в виде двоичных данных или ZIP-архива, в формате, аналогичном ПолучитьНавигационнуюСсылку.
<Имя> (обязательный)

Тип: Строка. Символическое имя подключаемой внешней компоненты.
Имя должно удовлетворять правилам именования встроенного языка.
<Тип> (необязательный)

Тип: ТипВнешнейКомпоненты. Тип подключаемой внешней компоненты.
Не используется, если компонента упакована в ZIP-архив.
Описание варианта метода:

Подключает компоненты, выполненые по технологии Native API и COM.
Компонента может храниться в информационной базе или макете конфигурации в виде двоичных данных или в ZIP-архиве.
Для тонкого клиента и веб-клиента, компонента должна быть предварительно установлена методом УстановитьВнешнююКомпоненту.
64 Elisy
 
22.12.10
14:46
(61) Радченко сказал
http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=557257#557424

"Вообще, в синтакс-помощнике описаны два варианта синтаксиса ПодключитьВнешнююКомпоненту():
1. ПодключитьВнешнююКомпоненту(<Местоположение>, <Имя>, <Тип>)
2. ПодключитьВнешнююКомпоненту(<ИдентификаторОбъекта>)
К сожалению дальше есть особенность, которая там не описана, но мы это исправим.
Первый вариант синтаксиса можно использовать и на клиенте, и на сервере и во внешнем соединении.
Второй вариант синтаксиса можно использовать только на клиенте."
65 Elisy
 
22.12.10
14:51
(62) Спасибо
Вместо __gc class сейчас используется ref class
вместо __gc __interface - interface class
В документации сказано про __gc: "This topic applies only to version 1 of Managed Extensions for C++. This syntax should only be used to maintain version 1 code. See Classes and Structs (Managed) for information on using the equivalent functionality in the new syntax."
а опция компилятора называется /clr:oldSyntax
66 Кирпич
 
22.12.10
14:58
(65) Спасибо. Просветил. Теперь можно MSDN сносить за ненадобностью.
67 Serginio1
 
22.12.10
16:31
(64) Значить Первый Вариант с ТипВнешнейКомпоненты.Com должен проходить?
68 Elisy
 
23.12.10
06:24
(66) В МСДН и сказано об устаревшем синтаксисе
69 Elisy
 
23.12.10
06:27
(67) Тоже обрадовался сперва. ТипВнешнейКомпоненты.Com на сервере игнорируется и берется ТипВнешнейКомпоненты.Native
70 Кирпич
 
23.12.10
08:30
(68) Как??!! От, блин, а я уже снёс.
71 orefkov
 
23.12.10
08:48
(55)
А шуму то, шуму то было, чуть не мировой заговор 1С против .NET'а.
72 Elisy
 
23.12.10
08:58
(71) А проблема осталась - с тем же успехом 1С могло ответить - для нормальной работы примера, нужно убрать опцию /clr. Дело в том, что после предложенного решения 1С любое создание .Net-объекта сопровождается таким же зависанием. Например, вызов простого метода:
#pragma managed
void CAddInNative::InitializeManaged()
{
   System::Object^ o = gcnew System::Object();
}
#pragma unmanaged

из методов CAddInNative::CallAsFunc или CAddInNative::Init
Проблема похожа на Loader Lock:
http://msdn.microsoft.com/en-us/library/ms173266(v=vs.80).aspx
73 orefkov
 
23.12.10
09:08
(72)
То есть ты уже в своей компоненте из unmanaged кода вызываешь managed код, а в зависании виновата 1С?
74 Кирпич
 
23.12.10
09:19
(72) Пиши опять в 1С. Раз ответили, пускай дальше отвечают. А ещё лучше подожди годик-другой. Кому нибудь приспичит сделать ВК на NativeAPI, он сделает и выложит. Или книжку купи какую нибудь чтоли, раз такой пытливый.
75 Elisy
 
23.12.10
09:19
(73) А иначе использовать опцию /CLR смысла нет. CLR подразумевает использование смешанного кода управляемого и неуправляемого. Сейчас я вижу, что 1С создает известную проблему "Loader Lock".
76 orefkov
 
23.12.10
09:20
(72)
И при чем здесь loader lock?
Он может возникнуть только при отработке DllMain, а твой код уже далеко вне этого.
77 orefkov
 
23.12.10
09:23
(75)
Не тупи, это не 1С создает проблему loader lock, а в реализации загрузки смешанных сборок у MS есть косяк, могущий приводить к loader lock. Ну и я уже писал, что этой проблемой здесь не пахнет, твой код вызывается уже после DllMain.
78 Elisy
 
23.12.10
09:23
(74) В 1С написал. Печально, но пока это самое трезвое решение - ждать. Или начать искать обходные пути.
79 Elisy
 
23.12.10
09:29
(77) Не знаю, кто виноват, я хочу получить работающее решение.
То что в 1С тоже не все гладко могу утверждать по 2м моментам:
1. Если в const WCHAR_T* GetClassNames() возвратить в 1С ""(ничего), в первый вызов зависания не происходит. Зависание происходит на 2м вызове.
2. Если в bool CAddInNative::CallAsFunc написать всего 1 строку return false; , происходит вылет 1С.
80 Elisy
 
23.12.10
09:34
Под отладчиком при зависании удалось поймать стек вызовов:
ntdll.dll!_RtlEnterCriticalSection@4()  + 0x17 bytes    
ntdll.dll!_LdrLockLoaderLock@12()  + 0x6b bytes    
Похоже, действительно Loader Lock
81 Serginio1
 
23.12.10
10:42
(60) спасибо. Надеюсь исправить в следующих весрсиях. А какая стоит у тебя?
 С другой стороны использование ВК на сервере не совсем понятно. Для 7 ки это было нужно из-за передачи объектов 1С, и отсутствия доступа 1С как внутреннего сервера автоматизации. Интерфейс обратного вызова больше для клиента. В 8 ке же есть Коннектор и можно использовать IDispatch в полном объеме (правда пока не проверял).
А в твоих задачах в чем перущество ВК перед IDispatch на сервере?
Желаю успехов подружить натив с сейвом в одной DLL.
Может применить 2 Нативную и нетовскую?
82 Elisy
 
23.12.10
10:57
(81) Спасибо. Через Сервер я думал сделать механизм доступности каких-то только серверных объектов для клиента. Сейчас клиент вообще ущербный получился. Например, на клиенте нельзя вызвать просто так команду вида:
элемент = Справочники.Организации.НайтиПоКоду("111");
Да и вообще нельзя вызвать большую часть доступных в 8.1 методов - только через серверные процедуры. Есть мечта сделать что-то вида:

&НаКлиенте
server = Net.GetServer();
элемент = server.Справочники.Организации.НайтиПоКоду("111");
83 Elisy
 
23.12.10
10:59
(81) Версию специально нашел последнюю (8.2.13.202)
84 loh_pedalny
 
23.12.10
11:15
Вот только из чисто спортивного интереса уже буду следить за веткой! :)
Складывается впечатление, что "чукча не читатель, чукча писатель" (С) Не мое :).
(82)Хоть доку по Технологии ВК читал? Про ограничения NativeAPI в курсе?
Из компоненты объект в строке передавать будешь? :)))

Как будет готова хотя бы пре-альфа компоненты, выложи плз куда-нибудь. Хочется в живую посмотреть на это чудо инженерной мысли. :)))
85 Serginio1
 
23.12.10
11:16
(82) Все это можно( и даже намного проще) решить через IDispatch как например в Delphi аналог DCOMa через TCP.
Но лучше конечно не делать из тонкого клиента толстого и большую часть вычислений делать на сервере.
Удачи.
86 Elisy
 
23.12.10
11:38
(84) Обязательно выложу ))))). 1С тоже на месте не стоит. Может и ограничения снимет. Пока к мечте буду идти, может еще найду несколько достойных применений.
Elisy LinqTo1C тоже сначала мечтой был, а сейчас уже небольшой доход приносить начал:
http://infostart.ru/public/77971/
87 loh_pedalny
 
23.12.10
11:55
(86)Спрячь и некому не показывай!
Любой твой клиент, которому ты продал ЭТО, автоматически нарушает ЛС от 1С: ОПИСАНИЕ ПРАВ И ОГРАНИЧЕНИЙ, п.4, $3.
Со всеми вытекающими. И в ответе можешь быть ты, т.к. ты продавец.
88 Elisy
 
23.12.10
14:12
(87) У нас разные взгляды на этот счет
89 Serginio1
 
23.12.10
16:01
(82) Кстати во мнгих случаях проще использовать ВэбСервисы
XDTO
например v8: Проблема с ЗаполнитьЗначенияСвойств элементов XDTO с неопределенным типом.
90 loh_pedalny
 
24.12.10
00:08
(87)Наши взгляды никого, кроме участников этого форума, не интересуют.
Главное, чтобы совпали взгляды юристов 1С и Ваших клиентов, при использовании ЭТОГО добра.
А если они не совпадут, то можно попасть на нехилую кучу бабок за то, что Вы не проинформировали покупателя, что Ваш продукт нарушает ЛС правообладателя. А если у него еще и пострадает бизнес... то, возможно, еще потребуется компенсировать упущенную выгоду.
Как-то так.
91 Elisy
 
24.12.10
07:46
(91) Лицензия 1С никому не интересна в данном контексте, так как сам запрет прямого доступа в лицензии 1С противоречит Гражданскому Кодексу РФ.
92 Elisy
 
25.12.10
06:14
Из 1С пришел ответ:
"Технические вопросы совместного использования управляемого и неуправляемого кода правильней задавать компании-производителю.
Специалисты компании 1С не имеют доступа к исходным кодам платформы .NET для детального анализа причин неработоспособности."
93 Elisy
 
18.01.11
12:11
(84) Решено было не включать в версию .Net Bridge 4.0 поддержку Native API. При обращении по Native API выдается сообщение об отсутствии поддержки. В 4ю версию добавили только поддержку тонкого клиента 8.2. Выложено на:
http://www.1centerprise.com/forums/viewtopic.php?f=9&t=13&start=10#p102
Анонс:
http://www.gotdotnet.ru/blogs/elisy/9264/