Сообщение Re[2]: Ошибка ucrtbase.dll Недопустимый параметр был передан от 01.09.2016 9:02
Изменено 19.09.2016 8:19 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 разрядной всё ОК
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.
Сейчас все без ошибок