Вопрос по sxs, dll, windows, manifest – Сборка и развертывание DLL на Windows: SxS, манифесты и все такое джаз

3

Начиная с VS 2005, я вижу, что невозможно просто создать dll для среды выполнения MS и развернуть их вместе (http://www.ddj.com/windows/184406482). Я глубоко сбит с толку манифестом, SxS и co: документация MSDN действительно плохая, с циклическими ссылками; тем более, что я в большей степени парень из Unix, я нахожу все это неинформативным. Моя основная проблема заключается в том, чтобы связать dll с msvc9 или msvc8: поскольку эти среды выполнения не подлежат распространению, каковы шаги для связывания и развертывания такой dll? В частности, как генерируется манифест (я не хочу mt.exe, я хочу что-то переносимое между компиляторами), как они встраиваются, используются? Что означает сборка бок о бок?

В основном, где я могу найти какую-либо спецификацию вместо жаргона MS?

Спасибо всем, кто ответил, это было действительно полезно,

Ваш Ответ

8   ответов
2

поэтому, возможно, некоторые из моих комментариев будут полезны.

The manifest is an xml file. While VS can and will make one for you when you compile, the other solution is to produce a resource file (.rc) and compile it into a compiled resource file (.res) using the resource compiler (rc.exe) included with VS. You'll want to run the VS commandline from the tools menu, which will cause rc to be in the path, as well as setting various environmental variables correctly. Then compile your resource. The resulting .res file can be used by other compilers. Make sure your manifest xml file's size is divisible by 4. Add whitespace in the middle of it to achieve this if needed. Try to avoid having any characters before the openning xml tag or after the closing xml tag. I've sometimes had issues with this. If you do step 2 incorrectly, expect to get side by side configuration errors. You can check if that is your mistake by openning the exe in a resource editor (e.g. devenv.exe) and examining the manifest resource. You can also see an example of a correct manifest by just opening a built file, though note that dlls and exes have tiny differences in what id the resource should be given.

Возможно, вы захотите протестировать Vista, чтобы убедиться, что она работает правильно.

0

уете Java JNI, вам нужно будет поместить их в каталог bin вашего JDK / JRE.

Если вы запускаете приложение в JBoss, вам нужно будет поместить их в каталог JBoss / bin.

Вы можете разместить свою JNI DLL там, где это подходит для вашего приложения.

2

объяснение рационального решения SxS crt для VC ++, Он включает в себя объяснение того, как плохо статически связывать CRT, и почему вы не должны этого делать.

Здесьдокументация о том, как статически связать CRT.

Спасибо за ссылки. Первое, в частности, делает некоторые вещи более понятными. Мне не нужно убеждаться в статической привязке среды выполнения C; проблема одинакова на любой ОС. David Cournapeau
0

я в Vista и Windows Server 2008, если у вас есть службы, которые вы хотите запустить, или программы, которые вы хотите запустить до установки «InstallFinalize». действие в MSI.

Это связано с тем, что библиотеки DLL установлены в WinSXS в разделе «InstallFinalize». действие.

Но MSI "ServiceStart" действие предшествует этому.

Так что используйте либо загрузчик & quot;http://www.davidguyer.us/bmg/publish.htm& Quot;

Или изучите использование цепочек установщика в установщике 4.5. Но это означает, что вам нужен загрузчик для установки 4.5, поэтому он кажется немного бессмысленным.

1

и у вас есть распространяемые пакеты внутри каталога msvs.

Сборка с выбранной вами средой выполнения, добавьте соответствующий пакет в ваш установщик и не беспокойтесь - он будет работать. Разница в том, что ониinstalled сейчас в другом месте (но именно там ваше приложение будет искать библиотеки).

В противном случае, MSDN или в основном любая не слишком старая книга по программированию на Windows C ++.

Мм, странно, я могу поклясться, что где-то на MSDN видел, что вы не можете распространять их, но теперь я больше не могу найти ссылку, у меня, должно быть, ошибка Однако использование распространяемого пакета не вариант (я не использую MSI). David Cournapeau
Вы не можете распространятьdebug CRT. Релиз один предназначен для распространения.
0

а затем:

Using .msi merge directive. Using the redistributable VS package and run it before my own installer Copying the redistributable files along my own application. But in this case, how do I refer to it in a filesystem hierarchy (say bar/foo1/foo1.dll and bar/foo2/foo2.dll refer to msvcr90.dll in bar/) ? I mean besides the obvious and ugly "copy the dll in every directory where you have dll which depends on it).
Если вы связываете файлы переадресации (согласно моему ответу) со своим приложением, поместите их в ту же папку, что и исполняемый файл. К счастью, загрузчик fusion сначала ищет в папке exe, когда пытается найти dll.
3

Затем DLL, vcmanifest.h, установите для всех проектов встроенный файл манифеста.

vcmanifest.h

/*----------------------------------------------------------------------------*/

#if _MSC_VER >= 1400

/*----------------------------------------------------------------------------*/

#pragma message ( "Setting up manifest..." )

/*----------------------------------------------------------------------------*/

#ifndef _CRT_ASSEMBLY_VERSION
#include <crtassem.h>
#endif 

/*----------------------------------------------------------------------------*/

#ifdef WIN64
    #pragma message ( "processorArchitecture=amd64" )
    #define MF_PROCESSORARCHITECTURE "amd64"
#else
    #pragma message ( "processorArchitecture=x86" )
    #define MF_PROCESSORARCHITECTURE "x86"
#endif 

/*----------------------------------------------------------------------------*/

#pragma message ( "Microsoft.Windows.Common-Controls=6.0.0.0") 
#pragma comment ( linker,"/manifestdependency:\"type='win32' " \
                  "name='Microsoft.Windows.Common-Controls' " \
                  "version='6.0.0.0' " \
                  "processorArchitecture='" MF_PROCESSORARCHITECTURE "' " \
                  "publicKeyToken='6595b64144ccf1df'\"" )

/*----------------------------------------------------------------------------*/

#ifdef _DEBUG
    #pragma message ( __LIBRARIES_ASSEMBLY_NAME_PREFIX ".DebugCRT=" _CRT_ASSEMBLY_VERSION ) 
    #pragma comment(linker,"/manifestdependency:\"type='win32' "            \
            "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".DebugCRT' "         \
            "version='" _CRT_ASSEMBLY_VERSION "' "                          \
            "processorArchitecture='" MF_PROCESSORARCHITECTURE "' "         \
            "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
#else
    #pragma message ( __LIBRARIES_ASSEMBLY_NAME_PREFIX ".CRT=" _CRT_ASSEMBLY_VERSION ) 
    #pragma comment(linker,"/manifestdependency:\"type='win32' "            \
            "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".CRT' "              \
            "version='" _CRT_ASSEMBLY_VERSION "' "                          \
            "processorArchitecture='" MF_PROCESSORARCHITECTURE "' "         \
            "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
#endif

/*----------------------------------------------------------------------------*/

#ifdef _MFC_ASSEMBLY_VERSION
    #ifdef _DEBUG
        #pragma message ( __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC=" _CRT_ASSEMBLY_VERSION ) 
        #pragma comment(linker,"/manifestdependency:\"type='win32' "            \
                "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC' "              \
                "version='" _MFC_ASSEMBLY_VERSION "' "                          \
                "processorArchitecture='" MF_PROCESSORARCHITECTURE "' "         \
                "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
    #else
        #pragma message ( __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC=" _CRT_ASSEMBLY_VERSION ) 
        #pragma comment(linker,"/manifestdependency:\"type='win32' "            \
                "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC' "              \
                "version='" _MFC_ASSEMBLY_VERSION "' "                          \
                "processorArchitecture='" MF_PROCESSORARCHITECTURE "' "         \
                "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
    #endif
#endif /* _MFC_ASSEMBLY_VERSION */

/*----------------------------------------------------------------------------*/

#endif /* _MSC_VER */

/*----------------------------------------------------------------------------*/
Я надеюсь, что вы все еще проверяете эту тему. Я, к сожалению, не могу использовать ваш файл как есть. Где я могу включить этот файл? Что мне делать, если я хочу поддерживать более низкую версию, чем на клиентском ПК, чем на компьютере разработчика? Любые предложения, которые вы можете предоставить, будут благословением. Если нет, я отправлю другой вопрос в stackoverflow.
3

Предполагая установку VS2005 по умолчанию, у вас будет такой путь:

C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT

Перейдите, возьмите файлы в этой папке для перенаправления и поместите файл .manifest И файл msvcr80.dll (как минимум) в папку .exe ваших приложений. Эти файлы, находящиеся в корне вашей установки, должны позволить вашему exe-файлу и всем dll, связанным с ними, работать без сбоев, не прибегая к слиянию модулей, MSI или даже к любому своевременному обнаружению того, что среда выполнения не установлена.

Похожие вопросы