none
Развертывание приложения с библиотекой на С++ .NET RRS feed

  • Вопрос

  • Я всегда полагал, что добротное приложение не должно иметь установщика. Все должно быть просто - скопировал папку и запустил исполняемый файл (создал ярлык на столе).
    .NET Framework позволяет реализовать такую парадигму: реестр не обязателен - на замену пришли XML-файлы, библиотеки могут располагаться в папке рядом с исполняемым файлом, компоненты не подлежат обязательной регистрации. Главное, чтобы на компьютере пользователя стоял сам фреймворк.
    Но ситуация со сборками, написанными на C++ и использующими .NET мне в корне не понятна. Чтобы развернуть такое приложение, я должен установить .NET и еще (!) .NET для С++, то есть библиотеки VC.CRT. Друзья, это же бред. Каков мотив Microsoft, чтобы не включить эти файлы (1,4 Мб) в стандартный дистрибутив dotnetfx?
    Очень интересно ваше мнение.

    Такая ситуация заставляет делать установщик, который будет включать пакет vcredist_x86. А от установщика хочется отказаться.
    Другой вариант: Развертывание библиотек DLL в Visual C++ в виде закрытых сборок. В этом случае необходимые dll-файлы размещаются в папке приложения. У меня этот вариант почему-то не прокатывает.

    При запуске приложения оно моментально сваливается в ошибку с предложением отправить отчет. Внешне выглядит также, как если бы библиотек Microsoft.VC90.CRT вообще не существовало в папке приложения. Но если открыть в панели управления просмотр системных событий, то становится видна иная последовательность ошибок:
    1. Идентификатор компонента в файле манифеста не соответствует запрошенному идентификатору компонента.
    2. Синтаксическая ошибка в манифесте или в файле политики "C:\Documents and Settings\XPMUser\Рабочий стол\Debug\Microsoft.VC90.CRT\Microsoft.VC90.CRT.MANIFEST" в строке 4.
    3. Generate Activation Context завершилась не удачно для C:\Documents and Settings\XPMUser\Рабочий стол\Debug\LUsbWrapper.dll. Соответствующее сообщение об ошибке: Операция успешно завершена.

    • Файлы Microsoft.VC90.CRT были взяты из папки %PROGDIR%\Microsoft Visual Studio 9.0\VC\Redist\x86.
    • Моя библиотека на C++ .NET откомпилирована в конфигурации Release.
    • Если установить vcredist_x86, приложение запускается нормально.

    Может где-то в свойствах проекта нужно указать, что Microsoft.VC90.CRT будет расположена локально?
    Основной вопрос темы: как сделать приложение с закрытыми (локальными) сборками?
    • Перемещено Tagore Bandlamudi 2 октября 2010 г. 22:03 MSDN Forums consolidation (От:Разработка Windows-приложений)
    19 октября 2009 г. 11:50

Ответы

  • Ответ для себя нашел здесь
    http://msdn.microsoft.com/ru-ru/library/cc664727.aspx

    Вообще, сделал вывод, что с развертыванием до сих пор не все так гладко в нынешние времена.

    Проблема заключалась в том, что VS2008 SP1 при разработке C++ приложения привязывается в манифесте по умолчанию к старой версии библиотек Microsoft.VC90.CRT 9.0.21022.8, которая входила в первоначальный состав пакета VS2008. А версии библиотек в пакете для распространения vcredist_x86 и в папке установки %VSPATH%\VC\redist\x86\Microsoft.VC90.CRT - новые, 9.0.30729.1.

    Поэтому получалось, что когда я устанавливаю VC90.CRT в общее хранилище WinSxS, загрузика приложения эти новые версии (относительно требуемых манифестом) устраивали. А вот если положить VC90.CRT локально, в папку приложения, тогда работает другое правило: подавай именно те версии библиотек, которые прописаны во внутреннем манифесте. Иначе происходит описанный выше краш.

    Все решилось добавлением строки в stdafx.h, которая делает мою библиотеку, привязанной к новой версии VC90.CRT.
    #define _BIND_TO_CURRENT_VCLIBS_VERSION 1

    • Помечено в качестве ответа SWinja 22 октября 2009 г. 10:50
    22 октября 2009 г. 10:50

Все ответы

  • Развертывание проекта установки и развертывания.. Вот тут есть инфа по закрытым сборкам...
    19 октября 2009 г. 13:05
  • Ответ для себя нашел здесь
    http://msdn.microsoft.com/ru-ru/library/cc664727.aspx

    Вообще, сделал вывод, что с развертыванием до сих пор не все так гладко в нынешние времена.

    Проблема заключалась в том, что VS2008 SP1 при разработке C++ приложения привязывается в манифесте по умолчанию к старой версии библиотек Microsoft.VC90.CRT 9.0.21022.8, которая входила в первоначальный состав пакета VS2008. А версии библиотек в пакете для распространения vcredist_x86 и в папке установки %VSPATH%\VC\redist\x86\Microsoft.VC90.CRT - новые, 9.0.30729.1.

    Поэтому получалось, что когда я устанавливаю VC90.CRT в общее хранилище WinSxS, загрузика приложения эти новые версии (относительно требуемых манифестом) устраивали. А вот если положить VC90.CRT локально, в папку приложения, тогда работает другое правило: подавай именно те версии библиотек, которые прописаны во внутреннем манифесте. Иначе происходит описанный выше краш.

    Все решилось добавлением строки в stdafx.h, которая делает мою библиотеку, привязанной к новой версии VC90.CRT.
    #define _BIND_TO_CURRENT_VCLIBS_VERSION 1

    • Помечено в качестве ответа SWinja 22 октября 2009 г. 10:50
    22 октября 2009 г. 10:50