在windows上构建和部署dll:SxS、清单等等

在windows上构建和部署dll:SxS、清单等等,windows,dll,manifest,sxs,Windows,Dll,Manifest,Sxs,自VS2005以来,我发现不可能简单地针对MS运行时构建dll并将它们一起部署()。我对清单、SxS和co深感困惑:MSDN文档非常糟糕,带有循环引用;特别是因为我更喜欢Unix,所以我发现所有这些都没有信息。我的核心问题是将dll链接到msvc9或msvc8:既然这些运行时是不可再分发的,那么链接和部署这样一个dll的步骤是什么?特别是,清单是如何生成的(我不想要mt.exe,我想要跨编译器移植的东西),它们是如何嵌入和使用的?并排装配是什么意思 基本上,我在哪里可以找到任何类型的规范而不是M

自VS2005以来,我发现不可能简单地针对MS运行时构建dll并将它们一起部署()。我对清单、SxS和co深感困惑:MSDN文档非常糟糕,带有循环引用;特别是因为我更喜欢Unix,所以我发现所有这些都没有信息。我的核心问题是将dll链接到msvc9或msvc8:既然这些运行时是不可再分发的,那么链接和部署这样一个dll的步骤是什么?特别是,清单是如何生成的(我不想要mt.exe,我想要跨编译器移植的东西),它们是如何嵌入和使用的?并排装配是什么意思

基本上,我在哪里可以找到任何类型的规范而不是MS术语


感谢所有回答的人,这真的很有帮助,

好吧,我遇到了一些问题,所以我的一些评论可能会有所帮助

  • 清单是一个xml文件。虽然VS可以并且将在编译时为您生成一个资源文件(.rc),另一个解决方案是使用VS附带的资源编译器(rc.exe)生成一个资源文件(.res)。您需要从“工具”菜单运行VS命令行,这将使rc位于路径中,以及正确设置各种环境变量。然后编译您的资源。生成的.res文件可供其他编译器使用
  • 确保清单xml文件的大小可以被4整除。如果需要的话,在中间添加空白。尽量避免在打开xml标记之前或关闭xml标记之后出现任何字符。我有时会遇到这样的问题。如果您错误地执行步骤2,则可能会出现并行配置错误。您可以通过在资源编辑器(例如devenv.exe)中打开exe并检查清单资源来检查这是否是您的错误。只需打开一个构建文件,您就可以看到一个正确清单的示例,不过请注意,DLL和EXE在应该为资源指定的id方面有微小的差异

  • 您可能需要在Vista上进行测试,以确保其正常工作。

    它们是可再发行的,并且您在msvs目录中有可再发行的软件包

    使用您选择的运行时构建,将相应的包添加到您的安装程序中,不必费心-它会工作的。不同之处在于——它们现在安装在不同的地方(但这也是应用程序查找库的地方)

    >,MSDN或基本上任何一本不太老的Windows C++编程书籍。

    < P>这是博客条目。它包括解释静态链接crt有多糟糕,以及为什么不应该这样做


    这是答案。

    谢谢你的回答。就部署本身而言,我可以看到3个选项,然后:

    • 使用.msi merge指令
    • 使用可再发行的VS包并在我自己的安装程序之前运行它
    • 沿着我自己的应用程序复制可再发行的文件。但是在本例中,我如何在文件系统层次结构中引用它(比如bar/foo1/foo1.dll和bar/foo2/foo2.dll在bar/中引用msvcr90.dll)?我的意思是,除了明显和丑陋的“复制每个目录中的dll,你有依赖它的dll”)

    我们在所有应用程序中使用一个简单的include文件&DLL,vcmifest.h,然后将所有项目设置为嵌入清单文件

    vcsmanifest.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 */
    
    /*----------------------------------------------------------------------------*/
    
    /*----------------------------------------------------------------------------*/
    #如果_MSC\u VER>=1400
    /*----------------------------------------------------------------------------*/
    #杂注消息(“设置清单…”)
    /*----------------------------------------------------------------------------*/
    #ifndef\U CRT\U组件\U版本
    #包括
    #恩迪夫
    /*----------------------------------------------------------------------------*/
    #ifdef WIN64
    #杂注消息(“processorArchitecture=amd64”)
    #定义MF_处理器体系结构“amd64”
    #否则
    #杂注消息(“processorArchitecture=x86”)
    #定义MF_处理器体系结构“x86”
    #恩迪夫
    /*----------------------------------------------------------------------------*/
    #pragma消息(“Microsoft.Windows.Common Controls=6.0.0.0”)
    #pragma注释(链接器,“/manifestdependency:\”类型='win32''\
    “name='Microsoft.Windows.Common控件'\
    “版本='6.0.0.0'”\
    “processorArchitecture=”“MF_processorArchitecture”\
    “publicKeyToken='6595b64144ccf1df'\”)
    /*----------------------------------------------------------------------------*/
    #ifdef_调试
    #pragma消息(uuuu库\程序集\名称\前缀“.DebugCRT=“\ucrt\程序集\版本”)
    #pragma注释(链接器,“/manifestdependency:\”类型='win32''\
    “名称=”“\uuuuu库\uu程序集\uu名称\uu前缀”.DebugCRT'”\
    “版本='”\u CRT\u程序集\u版本“\
    “processorArchitecture=”“MF_processorArchitecture”\
    “publicKeyToken=”\u VC\u程序集\u publicKeyToken“'\”)
    #否则
    #pragma消息(uuu库u程序集u名称u前缀“.CRT=“CRT\uAssembly\u版本)
    #pragma注释(链接器,“/manifestdependency:\”类型='win32''\
    “名称='”\uuuuu库\uu程序集\uu名称\uu前缀“.CRT'”\
    “版本='”\u CRT\u程序集\u版本“\
    “processorArchitecture=”“MF_processorArchitecture”\
    “publicKeyToken=”\u VC\u程序集\u publicKeyToken“'\”)
    #恩迪夫
    /*----------------------------------------------------------------------------*/
    #ifdef_MFC_组件_版本
    #ifdef_调试
    #pragma消息(uuu库\程序集\名称\前缀“.MFC=“\u CRT\程序集\版本”)
    #pragma注释(链接器,“/manifestdependency:\”类型='win32''\
    “名称='”_库\程序集\名称\前缀“.MFC'”
    
    C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT