Я создал приложение с редакцией Visual Studio 2015 Community. Когда некоторые из моих пользователей пытаются запустить его, они получают следующую ошибку:
Программа не может запускаться, потому что api-ms-win-crt-runtime-l1-1-0.dll отсутствует на вашем компьютере. Попробуйте переустановить программу, чтобы устранить эту проблему.
Ясно, что это решается установкой Обновление для универсального времени выполнения C в Windows (KB2999226). Я могу проверить исправление во время установки script, но все методы, которые я нашел для этого, являются слишком медленными или ненадежными.
Как предотвратить эту ошибку? Могу ли я изменить свое решение, чтобы я не нуждался в этой зависимости? Я связываюсь с чем-то, что могу удалить? Можно ли перераспределить исправление вместе с моим приложением?
Изменить: В свойствах проекта "Версия целевой платформы" - 8.1, а "Platform Toolset" - "Visual Studio 2015 (v140)", если это вообще помогает.
Изменить 2: Я попытался скопировать всю библиотеку DLL Universal C Runtime в каталог приложения, так как Теперь Microsoft разрешает (но не рекомендуется) локального режима установки UCRT. В C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64
есть 41 файл, а api-ms-win-crt-runtime-l1-1-0.dll
- один из них. Однако при запуске приложения результат этой ошибки:
Приложение не смогло начать правильно (0xc0000142). Нажмите "ОК", чтобы закрыть приложение.
Я пробовал отлаживать приложение с помощью MSVS 2015, но нигде не попадал. Я открыл исполняемый файл в Dependency Walker, и кажется, что я пропускаю похожие DLL, перечисленные в этом ответе, в котором говорится, что Dependency Walker устарел, и это красная селедка.
Я попробовал запустить приложение через Process Monitor (procmon), и там ничего необычного. Приложение просто вызывает "Создание процесса" на WerFault.exe, а затем "Выход из темы".
Изменить 3: Я включил загрузчик щелчком в исполняемом файле и получил это при запуске из cdb, если это помогает:
...
00c0:1200 @ 02106250 - LdrpFindOrMapDependency - RETURN: Status: 0x00000000
00c0:1200 @ 02106250 - LdrpFindOrMapDependency - ENTER: DLL name: api-ms-win-core-sysinfo-l1-2-1.dll.
00c0:1200 @ 02106250 - LdrpFindOrMapDependency - INFO: DLL name api-ms-win-core-sysinfo-l1-2-1.dll was redirected to C:\WINDOWS\SYSTEM32\kernelbase.dll by SxS.
00c0:1200 @ 02106250 - LdrpFindOrMapDll - ENTER: DLL name: C:\WINDOWS\SYSTEM32\kernelbase.dll
00c0:1200 @ 02106250 - LdrpResolveDllName - ENTER: DLL name: C:\WINDOWS\SYSTEM32\kernelbase.dll
00c0:1200 @ 02106250 - LdrpResolveDllName - RETURN: Status: 0x00000000
00c0:1200 @ 02106250 - LdrpFindOrMapDll - RETURN: Status: 0x00000000
00c0:1200 @ 02106250 - LdrpFindOrMapDependency - RETURN: Status: 0x00000000
00c0:1200 @ 02106250 - LdrpGetProcedureAddress - INFO: Locating procedure "RtlSetLastWin32Error" by name
00c0:1200 @ 02106250 - LdrpGetProcedureAddress - INFO: Locating procedure "RtlLeaveCriticalSection" by name
00c0:1200 @ 02106250 - LdrpGetProcedureAddress - INFO: Locating procedure "RtlEnterCriticalSection" by name
00c0:1200 @ 02106250 - LdrpGetProcedureAddress - INFO: Locating procedure "RtlInitializeCriticalSection" by name
00c0:1200 @ 02106250 - LdrpGetProcedureAddress - INFO: Locating procedure "RtlDeleteCriticalSection" by name
00c0:1200 @ 02106250 - LdrpGetProcedureAddress - INFO: Locating procedure "RtlQueryPerformanceCounter" by name
00c0:1200 @ 02106250 - LdrpGetProcedureAddress - INFO: Locating procedure "LdrResolveDelayLoadedAPI" by name
00c0:1200 @ 02106250 - LdrpMergeNodes - INFO: Merging a cycle rooted at USER32.dll.
00c0:1200 @ 02106250 - LdrpMergeNodes - INFO: Adding cyclic module GDI32.dll.
(c0.1200): Break instruction exception - code 80000003 (first chance)
*** ERROR: Symbol file could not be found. Defaulted to export symbols for ntdll.dll -
ntdll!LdrInitShimEngineDynamic+0x330:
00007ffc`d68732e8 cc int 3
0:000>