Информация об изменениях

Сообщение Re[2]: Ошибка ucrtbase.dll Недопустимый параметр был передан от 01.09.2016 9:02

Изменено 19.09.2016 8:19 Serginio1

Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, Serginio1, Вы писали:


S> Суть такая из натива вызываем статические методы .Net библиотеки.

S>Под 32 разрядными dll и exe все прекрасно.

S>Скомпилировал под 64 разрядное. Если запускать из экзешника

S>То все нормально. Но если из 64 разрядной 1С 8.3.9


S>Выдает ошибку

S>Необработанное исключение по адресу 0x00007FFD76FB8528 (ucrtbase.dll) в 1cv8.exe: Недопустимый параметр был передан функции, для которой недопустимые параметры вызывают неустранимую ошибку.

S>Вот экспортируемуе методы


S>typedef bool(STDMETHODCALLTYPE *ManagedCallAsFunc)(const __int32, const wchar_t*, tVariant* pvarRetValue, tVariant* paParams, const __int32 lSizeArray);

S> typedef int(STDMETHODCALLTYPE *ManagedGetNParams)(const __int32, const wchar_t*);
S> typedef bool(STDMETHODCALLTYPE *ManagedGetPropVal)(const __int32, const wchar_t*, tVariant*);
S> typedef bool(STDMETHODCALLTYPE *ManagedSetPropVal)(const __int32, const wchar_t*, tVariant*);
S> typedef void(STDMETHODCALLTYPE *ManagedSetDelegate)(void*(*) (long), void(*) (const wchar_t*), void(*) (wchar_t*, wchar_t*,wchar_t*));
S> typedef void(STDMETHODCALLTYPE *ManagedDeleteObject)(const __int32);
S> typedef void(STDMETHODCALLTYPE *ManagedSetPath)(const wchar_t*);
S> typedef int(STDMETHODCALLTYPE *Managedtest)();

S>Или 1С использует не ту библиотеку?


S>Прчем сделал метод без параметра int test() и на него ругается. Хотя функции экспортируются


Вот Стек

ucrtbase.dll!_invoke_watson() Нет данных
ucrtbase.dll!_invalid_parameter() Нет данных
ucrtbase.dll!_invalid_parameter_noinfo() Нет данных
ucrtbase.dll!_setmode() Нет данных
clrjit.dll!jitStartup() Нет данных
coreclr.dll!EEJitManager::SetCpuInfo(void) Нет данных
coreclr.dll!EEJitManager::LoadJIT(void) Нет данных
coreclr.dll!UnsafeJitFunction(class MethodDesc *,class COR_ILMETHOD_DECODER *,unsigned long,unsigned long,unsigned long *) Нет данных
coreclr.dll!MethodDesc::MakeJitWorker(class COR_ILMETHOD_DECODER *,unsigned long,unsigned long) Нет данных
coreclr.dll!MethodDesc::DoPrestub(class MethodTable *) Нет данных
coreclr.dll!PreStubWorker() Нет данных
coreclr.dll!ThePreStub() Нет данных
coreclr.dll!UMThunkStub() Нет данных
> AddInNetObjectToNative64.dll!NetObjectToNative::ManagedDomainLoader::CreateManagedDomain(NetObjectToNative::CoreClrStartParams * pCoreClrStartupParams)Строка 128 C++


Получаю ссылку на метод так

bool ManagedDomainLoader::CreateDelegate(DWORD appDomainID,  wstring MethodName, INT_PTR * fnPtr)
    {

        HRESULT    hr = ClrLoader::pClrLoader->pCLRRuntimeHost->CreateDelegate(
            appDomainID,
            L"NetObjectToNative",
            L"NetObjectToNative.AutoWrap",
            MethodName.c_str(),
            (INT_PTR*)fnPtr);

        if (FAILED(hr))
        {
            wprintf_s(L"Failed to create a delegate to the managed entry point: %s\n", MethodName.c_str());
            printf_s("Failed to create a delegate to the managed entry point: (%d).\n", hr);
            ClrLoader::pClrLoader->pCLRRuntimeHost->UnloadAppDomain(appDomainID, true);
            return false;
        }
    
        
        return true;
    }


Ошибка возникает при вызове любого метода

int tst = ptest();


Если я создаю приложение из VS 2015 и вызываю этот код то все прекрасно, но если я вызываю его из 1С из DLL то для 64 разрядного приложения получаю такую ошибку.
Для 32 разрядной всё ОК
Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, Serginio1, Вы писали:


S> Суть такая из натива вызываем статические методы .Net библиотеки.

S>Под 32 разрядными dll и exe все прекрасно.

S>Скомпилировал под 64 разрядное. Если запускать из экзешника

S>То все нормально. Но если из 64 разрядной 1С 8.3.9


Вот Стек

ucrtbase.dll!_invoke_watson() Нет данных
ucrtbase.dll!_invalid_parameter() Нет данных
ucrtbase.dll!_invalid_parameter_noinfo() Нет данных
ucrtbase.dll!_setmode() Нет данных
clrjit.dll!jitStartup() Нет данных
coreclr.dll!EEJitManager::SetCpuInfo(void) Нет данных
coreclr.dll!EEJitManager::LoadJIT(void) Нет данных
coreclr.dll!UnsafeJitFunction(class MethodDesc *,class COR_ILMETHOD_DECODER *,unsigned long,unsigned long,unsigned long *) Нет данных
coreclr.dll!MethodDesc::MakeJitWorker(class COR_ILMETHOD_DECODER *,unsigned long,unsigned long) Нет данных
coreclr.dll!MethodDesc::DoPrestub(class MethodTable *) Нет данных
coreclr.dll!PreStubWorker() Нет данных
coreclr.dll!ThePreStub() Нет данных
coreclr.dll!UMThunkStub() Нет данных
> AddInNetObjectToNative64.dll!NetObjectToNative::ManagedDomainLoader::CreateManagedDomain(NetObjectToNative::CoreClrStartParams * pCoreClrStartupParams)Строка 128 C++



В новой версии
https://blogs.msdn.microsoft.com/dotnet/2016/09/13/announcing-september-2016-updates-for-net-core-1-0/

Исправили ошибку

https://github.com/dotnet/coreclr/issues/6460

In Jitstartup, JIT creates a file descriptor for stdout and unconditionally passes it to setmode, without checking for failures. This happens at https://github.com/dotnet/coreclr/blob/ee680783778ed0abb186ae41a8c861d5cdcadccd/src/jit/ee_il_dll.cpp#L76.

Failure to check for invalid descriptors can result in setmode triggering failfast.


Сейчас все без ошибок