Разработка Native-компонент (ВК) для 1С:Предприятия с использованием C++ в среде Microsoft Visual Studio нередко сопровождается ситуацией, когда на рабочей станции разработчика под управлением Windows 10 библиотека загружается и выполняется штатно, а при переносе на Windows Server 2012 вызов метода ПодключитьВнешнююКомпоненту завершается ошибкой или библиотека вовсе не инициализируется. Разберем основные причины такого поведения и пошагово настроим параметры компиляции и серверную среду.
Выясним причину различий в поведении операционных систем. В клиентской Windows 10 библиотеки среды выполнения Visual C++ (vcruntime140.dll, msvcp140.dll) и компоненты Universal CRT (набор библиотек api-ms-win-crt-*.dll) почти всегда установлены по умолчанию или обновлены системой. В базовых образах Windows Server 2012 эти компоненты могут отсутствовать.
Если проект скомпилирован с динамической линковкой (флаг /MD), при попытке загрузки DLL платформа 1С не сможет найти нужные системные вызовы. Решить проблему можно двумя путями:
Посмотрим на ошибку сборки, которая часто возникает при попытке адаптировать проект под старые ОС:
warning MSB8030: The linker switch "Minimum Required Version" requires "SubSystem" to be set... fatal error LNK1104: не удается открыть файл ",5.01"
Проанализируем ситуацию: данная ошибка линковщика возникает, если в свойствах проекта указана минимальная требуемая версия системы (например, 5.01 для Windows XP), но не определен сам тип целевой подсистемы. В результате линковщик неверно формирует строку параметров командной строки.
Разберем по шагам, как правильно настроить параметры сборки в Visual Studio:
v140_xp) не требуется — оставим стандартный Visual Studio 2015 (v140) или более актуальный.Windows (/SUBSYSTEM:WINDOWS) или оставлен пустым по умолчанию для динамических библиотек (DLL).Рассмотрим еще один важный фактор: разрядность скомпилированной динамической библиотеки должна строго соответствовать разрядности процесса, выполняющего загрузку.
ПодключитьВнешнююКомпоненту вызывается на стороне сервера («НаСервере»), библиотека загружается процессом рабочего процесса кластера 1С:Предприятия (rphost.exe). Если сервер 1С 64-разрядный, а скомпилирована была только 32-разрядная DLL (x86), подключение завершится ошибкой.Для универсального решения сформируем архив внешней компоненты с файлом-манифестом manifest.xml, в котором опишем модули под разные платформы и архитектуры:
<bundle>
<component os="Windows" path="MyComponent32.dll" type="native" arch="i386"/>
<component os="Windows" path="MyComponent64.dll" type="native" arch="x86_64"/>
</bundle>
При использовании такого zip-архива платформа 1С автоматически извлечет и подключит требуемую библиотеку под нужную битность процесса.
Если код выполняется на сервере, проверим права доступа учетной записи службы 1С (по умолчанию USR1CV8):
%TEMP%), куда платформа распаковывает вложения.GetClassObject, DestroyObject, GetClassNames и SetPlatformCapabilities.