Проблема с зависанием С++ dll с опцией /CLR
От: Elisy http://www.1centerprise.com
Дата: 14.12.10 05:25
Оценка:
Добрый день,
сталкнулся с проблемой зависания 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));    
КонецПроцедуры


Комментируя код, относящийся к клиенту или серверу, можно понять, что проблема характерна как для клиента, так и для сервера.
Проблема серьезная для многих, так как она блокирует использование ВК, написанных с применением .Net, на сервере 1С.

20.12.10 17:32: Перенесено модератором из 'C/C++' — Odi$$ey
Re: Проблема с зависанием С++ dll с опцией /CLR
От: Elisy http://www.1centerprise.com
Дата: 21.12.10 04:19
Оценка:
С момента создания поста появились новые факты.
1. Проблема воспроизводится не у всех:
http://forum.infostart.ru/forum24/topic37115/message406055/#message406055

2. При зависании стек вызовов содержит:
ntdll.dll!_RtlCompareMemoryUlong@12() + 0x10 bytes
ntdll.dll!@RtlpFreeHeap@16() + 0x10b bytes
ntdll.dll!_RtlFreeHeap@12() + 0xe37 bytes
ntdll.dll!_RtlDebugFreeHeap@12() + 0x1f9 bytes
ntdll.dll!@RtlpFreeHeap@16() + 0x34d58 bytes
ntdll.dll!_RtlFreeHeap@12() + 0xe37 bytes
kernel32.dll!_HeapFree@12() + 0x14 bytes
> clr.dll!EEHeapFree() + 0x22 bytes
clr.dll!EEHeapFreeInProcessHeap() + 0x1e bytes
clr.dll!operator delete[]() + 0x30 bytes
clr.dll!ExecuteDLLForAttach() + 0x114 bytes
clr.dll!ExecuteDLL() + 0xc9 bytes
clr.dll!CorDllMainForThunk() + 0x6b bytes
mscoreei.dll!CorDllMainWorkerForThunk() + 0x74 bytes
mscoreei.dll!_VTableBootstrapThunkInitHelper@4() + 0x1d bytes
mscoreei.dll!_VTableBootstrapThunkInitHelperStub@0() + 0xc bytes

или

> clr.dll!SString::CaseCompareHelper() + 0x2a bytes

clr.dll!SString::EqualsCaseInsensitive() + 0x34fa5 bytes
clr.dll!PEImage::PathEquals() + 0x16 bytes
clr.dll!DomainAssembly::FindIJWModule() — 0x10 bytes
clr.dll!AppDomain::FindIJWDomainFile() + 0x4e bytes
clr.dll!ExecuteDLLForAttach() + 0xc5 bytes
clr.dll!ExecuteDLL() + 0xc9 bytes
clr.dll!CorDllMainForThunk() + 0x6b bytes
mscoreei.dll!CorDllMainWorkerForThunk() + 0x74 bytes
mscoreei.dll!_VTableBootstrapThunkInitHelper@4() + 0x1d bytes
mscoreei.dll!_VTableBootstrapThunkInitHelperStub@0() + 0xc bytes
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.