由于VS2005年,我看到它是不可能简单地建立一个dll对MS运行,并将它们部署在一起(http://www.ddj.com/windows/184406482).我深感困惑的清单,智和有限:MSDN文件是真正的穷人,圆形的参考资料;特别因为我更Unix家伙,我找到所有这些不提供信息.我的核心问题是联dll对msvc9或msvc8:由于这些运行是不可再发,有哪些步骤向链接和部署这样一个dll?特别是,如何清单所产生的(我也不想mt.exe我想要的东西,它是便携式的跨汇编者),他们如何嵌入、使用?什么肩会的意思吗?

基本上,我在哪里可以找到任何种类的规范,而不是MS行话?

谢谢你的人回答说,这是真正有用的,

有帮助吗?

解决方案

我们在所有应用程序中使用简单的包含文件& 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 */

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

其他提示

最简单的事情: 假设默认安装VS2005,您将拥有如下路径:

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

开始,抓取此redist文件夹中的文件,并将.manifest和msvcr80.dll(至少)放在应用程序.exe文件夹中。 存在于安装根目录中的这些文件应该使您的exe和所有链接到它们的dll能够完美地工作,而无需使用合并模块,MSI或实际上任何未安装运行时的即时检测。

以下是博客文章解释SxS背后的理性crt决定VC ++ 。它包括解释静态链接crt有多糟糕,以及为什么不应该这样做。

以下是有关如何静态链接的文档CRT

好吧,我遇到过其中的一些问题,所以也许我的一些评论会有所帮助。

  1. 清单是一个xml文件。虽然VS可以并且将在编译时为您创建一个,但另一个解决方案是生成资源文件(.rc)并使用VS附带的资源编译器(rc.exe)将其编译为已编译的资源文件(.res) 。您将需要从工具菜单运行VS命令行,这将导致rc位于路径中,以及正确设置各种环境变量。然后编译您的资源。生成的.res文件可供其他编译器使用。
  2. 确保清单xml文件的大小可被4整除。在其中间添加空格以在需要时实现此目的。尽量避免在openning xml标记之前或关闭xml标记之后有任何字符。我有时会遇到这个问题。如果您错误地执行了第2步,则期望获得并排配置错误。您可以通过在资源编辑器(例如devenv.exe)中打开exe并检查清单资源来检查这是否是您的错误。您还可以通过打开构建的文件来查看正确清单的示例,但请注意,dll和exes在应该给予资源的ID方面存在细微差别。
  3. 您可能希望在Vista上进行测试,以确保其正常运行。

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

使用您选择的运行时构建,将相应的软件包添加到您的安装程序并且不要打扰 - 它会起作用。不同之处在于 - 它们现在已安装位于不同的位置(但这也是您的应用程序要查找库的地方)。

否则,MSDN或基本上任何关于Windows c ++编程的不太旧的书。

谢谢你的回答。部署本身的,我可以看到3个选项,则:

  • 使用。msi合并的指令。
  • 使用可再发VS包装和运行这之前,我自己的安装者
  • 复制的可再发 文件 沿着我自己的应用程序。但在这种情况下,我怎么提到它在文件系统层次(说bar/foo1/foo1.dll 和bar/foo2/foo2.dll 请参阅msvcr90.dll 在酒吧/)?我的意思是除了显而易见的,丑陋的"复制dll在每一个目录dll这取决于它)。

如果您要启动服务,或者想要在“InstallFinalize”之前运行的程序,则不能将VC ++ 8 SP1 / 9 CRT用作Vista和Windows Server 2008上的合并模块。 MSI中的行动。

这是因为dll安装在WinSXS中的“InstallFinalize”中。动作。

但MSI“ServiceStart”在此之前采取行动。

所以使用引导程序“ http://www.davidguyer.us/bmg/ publish.htm &QUOT;

或者考虑使用安装程序4.5中的安装程序。但这意味着你需要一个bootstrapper来安装4.5所以它似乎有点无意义。

如果您打算部署Microsoft DLLs / .manifest文件并使用Java JNI,则需要将它们放在JDK / JRE的bin目录中。

如果您在JBoss中运行应用程序,则需要将它们放在JBoss / bin目录中。

您可以将JNI DLL放在适合您应用程序的位置。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top