windowsdllmanifestsxs

Building and deploying dll on windows: SxS, manifests and all that jazz


Since VS 2005, I see that it is not possible to simply build a dll against MS runtime and deploy them together (http://www.ddj.com/windows/184406482). I am deeply confused by manifest, SxS and co: MSDN documentation is really poor, with circular references; specially since I am more a Unix guy, I find all those uninformative. My core problem is linking a dll against msvc9 or msvc8: since those runtime are not redistributable, what are the steps to link and deploy such a dll ? In particular, how are the manifest generated (I don't want mt.exe, I want something which is portable across compilers), how are they embedded, used ? What does Side by side assembly mean ?

Basically, where can I find any kind of specification instead of MS jargon ?

Thank you to everyone who answered, this was really helpful,


Solution

  • We use a simple include file in all our applications & DLL's, vcmanifest.h, then set all projects to embedded the manifest file.

    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 */
    
    /*----------------------------------------------------------------------------*/