![]() |
![]() |
![]() |
|
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/ |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |