自VS 2005以来,我发现不可能简单地针对MS运行时构建一个dll并将它们一起部署(http://www.ddj.com/windows/184406482)。我很惊讶清单,SxS和co:MSDN文档真的很差,带有循环引用;特别是因为我更像是一个Unix家伙,所以我发现所有那些没有信息的人。我的核心问题是将一个DLL链接到msvc9或msvc8:因为那些运行时不可再发行,链接和部署这样一个dll的步骤是什么?特别是,如何生成清单(我不想要mt.exe,我想要一些可以跨编译器移植的东西),它们是如何嵌入,使用的?并排装配意味着什么?
基本上,我在哪里可以找到任何类型的规范而不是MS行话?
感谢所有回答的人,这真的很有帮助,
答案 0 :(得分: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 */
/*----------------------------------------------------------------------------*/
答案 1 :(得分:3)
最简单的事情: 假设默认安装VS2005,您将拥有如下路径:
C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT
开始,抓取此redist文件夹中的文件,并将.manifest和msvcr80.dll(至少)放在应用程序.exe文件夹中。 存在于安装根目录中的这些文件应该使您的exe和所有链接到它们的dll能够完美地工作,而无需使用合并模块,MSI或实际上任何未安装运行时的即时检测。
答案 2 :(得分:2)
好吧,我遇到过其中的一些问题,所以也许我的一些评论会有所帮助。
您可能希望在Vista上进行测试,以确保其正常运行。
答案 3 :(得分:2)
以下是博客条目explaining the rational behind the SxS crt decision for VC++。它包括解释静态链接crt有多糟糕,以及为什么不应该这样做。
答案 4 :(得分:1)
它们是可再发行的,并且在msvs目录中有可再发行的包。
使用您选择的运行时构建,将相应的软件包添加到您的安装程序并且不要打扰 - 它会起作用。不同之处在于 - 它们现在已安装位于不同的地方(但这也是您的应用程序要查找库的地方)。
否则,MSDN或基本上任何关于Windows c ++编程的不太旧的书。
答案 5 :(得分:0)
感谢您的回答。对于本身的部署,我可以看到3个选项,然后:
答案 6 :(得分:0)
如果您要启动服务,或者想要在“InstallFinalize”操作之前运行的程序,则不能将VC ++ 8 SP1 / 9 CRT用作Vista和Windows Server 2008上的合并模块MSI。
这是因为dll在“InstallFinalize”操作中安装在WinSXS中。
但MSI“ServiceStart”行动就在此之前。
因此使用引导程序“http://www.davidguyer.us/bmg/publish.htm”
或者考虑使用安装程序4.5中的安装程序。但这意味着你需要一个bootstrapper来安装4.5所以它似乎有点无意义。
答案 7 :(得分:0)
如果您打算部署Microsoft DLLs / .manifest文件并使用Java JNI,则需要将它们放在JDK / JRE的bin目录中。
如果您在JBoss中运行应用程序,则需要将它们放在JBoss / bin目录中。
您可以将JNI DLL放在适合您应用程序的位置。