每一程序集,无论是静态的还是动态的,均包含描述该程序集中各元素彼此如何关联的数据集合。程序集清单就包含这些程序集元数据。程序集清单包含
指定该程序集的版本要求和安全标识所需的所有元数据,以及定义该程序集的范围和解析对资源和类的引用所需的全部元数据。程序集清单可以存储在具
有 Microsoft 中间语言 (MSIL) 代码的 PE 文件(.exe 或 .dll)中,也可存储在只包含程序集清单信息的独立 PE 文件中。
对于有一个关联文件的程序集,该清单将被合并到 PE 文件中以构成单文件程序集。您可以创建有独立的清单文件,或清单被合并到同一多文件程序集中
某一 PE 文件的多文件程序集。
每一程序集的清单均执行以下功能:
1. 枚举构成该程序集的文件。
2. 控制对该程序集的类型和资源的引用如何映射到包含其声明和实现的文件。
3. 枚举该程序集所依赖的其他程序集。
4. 在程序集的使用者和程序集的实现详细信息的使用者之间提供一定程度的间接性。
5. 呈现程序集自述。
程序集清单(Assembly Manifest)内容以XML文件格式描述,扩展名为(.manifest),对于一个应用程序我们可以通过关联程序集清单来控制需要运行的权限级别,执行程序需要的运行时,使用何种风格等。
以下程序集清单(Assembly Manifest)示例使你的程序在VISTA和WIN7下需要管理员权限,即在程序运行时弹出UAC提升权限对话框。
如果希望更改 Windows 用户帐户控制级别,请用以下节点之一替换 requestedExecutionLevel 节点。
关联方式一般有两种:程序内部嵌入和外部关联。
程序内部嵌入方式的操作步骤为:
1. 新建一个程序集清单(Assembly Manifest)文件命名为"你的应用程序名.manifest",如你生成的文件为"Test.exe",那程序集清单(Assembly Manifest)文件名为"Test.exe.manifest"。
2. 导入资源选择刚刚新建的程序集清单(Assembly Manifest)文件(Test.exe.manifest),在弹出的资源类型对话框中输入"RT_MANIFEST",找到刚刚添加的资源,将它的ID属性修改为1,当然对于内部嵌入来说程序集清单文件名,资源类型和ID都是可以自定义的。
3. 重新编译你的程序即可。
外部关联方式的操作步骤为:
1. 新建一个程序集清单(Assembly Manifest)文件命名为"你的应用程序名.manifest",如你生成的文件为"Test.exe",那程序集清单(Assembly Manifest)文件名为"Test.exe.manifest"。
2. 将"Test.exe.manifest"放在你编译的"Test.exe"同一目录下即可。
注:若使用程序内部嵌入方式且程序集清单中定义需要管理员权限或以上权限时,编译的程序图标将有小盾牌标示,外部关联不会显示小盾牌。
以下程序清单文件文件使你的程序使用WINXP风格的控件:
这里要注意的是程序运行需要XP及以后系统,且偶测试的VC6编译只能使用程序内部嵌入方式,按以上所说步骤操作,导入的资源类型里输入"24"(仅数字),找到添加的资源,将它的ID属性修改"1"(仅数字)。或许VC7及以后版本可以使用外部外部关联方式。
以上所述均已在VC6+WIN7下测试成功!
以下主要解决使用VC.NET编译的程序在未安装 .NET Framework 的电脑,如新安装的XP系统中运行弹出"由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。"的提示信息而无法运行的问题。以VS2008SP1为
例,我们使用向导生成一个普通的对话框程序(MFC 应用程序)。
1. 在工程属性->Manifest Tool->Input and Output->Embed Manifest 选择 "No",这样编译时不会自动嵌入程序清单文件,我们使用外部程序清单文件以便于修改,当然使用程序内部嵌入方式也是有办法修改的。
2. 打开VS2008安装目录下的路径"VC\redist\x86\Microsoft.VC90.CRT",里面有 Microsoft.VC90.CRT.manifest,msvcm90.dll,msvcp90.dll 和 msvcr90.dll 四个文件。
3. 打开VS2008安装目录下的路径"VC\redist\x86\Microsoft.VC90.MFC",里面有 Microsoft.VC90.MFC.manifest,mfc90.dll,mfc90u.dll, mfcm90.dll 和 mfcm90u.dll 五个文件。
4. 用记事本打开 Microsoft.VC90.CRT.manifest 文件可以找到版本号 "version=9.0.30729.1",记下些版本号备用。
5. 生成你的应用程序Release版本,并使用 dependency walker 查看依赖的库,这里应该是 "mfc90.dll" 和 "msvcr90.dll" 两个,将这两个文件和 "Microsoft.VC90.CRT.manifest" 以及 "Microsoft.VC90.MFC.manifest" 复制到生成的EXE同目录。
6. 在你生成应用程序同目录下建立 "你的应用程序名.manifest" 文件,如你的程序是 "Test.exe",则建立的文件名为 "Test.exe.manifest"。然后打开输入以下代码(注意下面代码里的 Version 后对应版本要与你上面记下的版本一致):
以上运行库相关在 VS2008 SP1 和全新的 WinXP SP3 下测试通过
指定该程序集的版本要求和安全标识所需的所有元数据,以及定义该程序集的范围和解析对资源和类的引用所需的全部元数据。程序集清单可以存储在具
有 Microsoft 中间语言 (MSIL) 代码的 PE 文件(.exe 或 .dll)中,也可存储在只包含程序集清单信息的独立 PE 文件中。
对于有一个关联文件的程序集,该清单将被合并到 PE 文件中以构成单文件程序集。您可以创建有独立的清单文件,或清单被合并到同一多文件程序集中
某一 PE 文件的多文件程序集。
每一程序集的清单均执行以下功能:
1. 枚举构成该程序集的文件。
2. 控制对该程序集的类型和资源的引用如何映射到包含其声明和实现的文件。
3. 枚举该程序集所依赖的其他程序集。
4. 在程序集的使用者和程序集的实现详细信息的使用者之间提供一定程度的间接性。
5. 呈现程序集自述。
程序集清单(Assembly Manifest)内容以XML文件格式描述,扩展名为(.manifest),对于一个应用程序我们可以通过关联程序集清单来控制需要运行的权限级别,执行程序需要的运行时,使用何种风格等。
以下程序集清单(Assembly Manifest)示例使你的程序在VISTA和WIN7下需要管理员权限,即在程序运行时弹出UAC提升权限对话框。
- <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
- <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
- <assemblyIdentity
- version="1.0.0.0"
- processorArchitecture="X86"
- name="test.exe.manifest"
- type="win32"
- />
- <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
- <security>
- <requestedPrivileges>
- <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
- </requestedPrivileges>
- </security>
- </trustInfo>
- </assembly>
如果希望更改 Windows 用户帐户控制级别,请用以下节点之一替换 requestedExecutionLevel 节点。
- <!--普通权限-->
- <requestedExecutionLevel level="asInvoker" uiAccess="false" />
- <!--管理员权限-->
- <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
- <!--最高权限-->
- <requestedExecutionLevel level="highestAvailable" uiAccess="false" />
关联方式一般有两种:程序内部嵌入和外部关联。
程序内部嵌入方式的操作步骤为:
1. 新建一个程序集清单(Assembly Manifest)文件命名为"你的应用程序名.manifest",如你生成的文件为"Test.exe",那程序集清单(Assembly Manifest)文件名为"Test.exe.manifest"。
2. 导入资源选择刚刚新建的程序集清单(Assembly Manifest)文件(Test.exe.manifest),在弹出的资源类型对话框中输入"RT_MANIFEST",找到刚刚添加的资源,将它的ID属性修改为1,当然对于内部嵌入来说程序集清单文件名,资源类型和ID都是可以自定义的。
3. 重新编译你的程序即可。
外部关联方式的操作步骤为:
1. 新建一个程序集清单(Assembly Manifest)文件命名为"你的应用程序名.manifest",如你生成的文件为"Test.exe",那程序集清单(Assembly Manifest)文件名为"Test.exe.manifest"。
2. 将"Test.exe.manifest"放在你编译的"Test.exe"同一目录下即可。
注:若使用程序内部嵌入方式且程序集清单中定义需要管理员权限或以上权限时,编译的程序图标将有小盾牌标示,外部关联不会显示小盾牌。
以下程序清单文件文件使你的程序使用WINXP风格的控件:
- <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
- <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
- <assemblyIdentity
- version="1.0.0.0"
- processorArchitecture="X86"
- name="Test.exe.manifest"
- type="win32"
- />
- <description>Test application for xp style.</description>
- <dependency>
- <dependentAssembly>
- <assemblyIdentity
- type="win32"
- name="Microsoft.Windows.Common-Controls"
- version="6.0.0.0"
- processorArchitecture="X86"
- publicKeyToken="6595b64144ccf1df"
- language="*"
- />
- </dependentAssembly>
- </dependency>
- </assembly>
这里要注意的是程序运行需要XP及以后系统,且偶测试的VC6编译只能使用程序内部嵌入方式,按以上所说步骤操作,导入的资源类型里输入"24"(仅数字),找到添加的资源,将它的ID属性修改"1"(仅数字)。或许VC7及以后版本可以使用外部外部关联方式。
以上所述均已在VC6+WIN7下测试成功!
以下主要解决使用VC.NET编译的程序在未安装 .NET Framework 的电脑,如新安装的XP系统中运行弹出"由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。"的提示信息而无法运行的问题。以VS2008SP1为
例,我们使用向导生成一个普通的对话框程序(MFC 应用程序)。
1. 在工程属性->Manifest Tool->Input and Output->Embed Manifest 选择 "No",这样编译时不会自动嵌入程序清单文件,我们使用外部程序清单文件以便于修改,当然使用程序内部嵌入方式也是有办法修改的。
2. 打开VS2008安装目录下的路径"VC\redist\x86\Microsoft.VC90.CRT",里面有 Microsoft.VC90.CRT.manifest,msvcm90.dll,msvcp90.dll 和 msvcr90.dll 四个文件。
3. 打开VS2008安装目录下的路径"VC\redist\x86\Microsoft.VC90.MFC",里面有 Microsoft.VC90.MFC.manifest,mfc90.dll,mfc90u.dll, mfcm90.dll 和 mfcm90u.dll 五个文件。
4. 用记事本打开 Microsoft.VC90.CRT.manifest 文件可以找到版本号 "version=9.0.30729.1",记下些版本号备用。
5. 生成你的应用程序Release版本,并使用 dependency walker 查看依赖的库,这里应该是 "mfc90.dll" 和 "msvcr90.dll" 两个,将这两个文件和 "Microsoft.VC90.CRT.manifest" 以及 "Microsoft.VC90.MFC.manifest" 复制到生成的EXE同目录。
6. 在你生成应用程序同目录下建立 "你的应用程序名.manifest" 文件,如你的程序是 "Test.exe",则建立的文件名为 "Test.exe.manifest"。然后打开输入以下代码(注意下面代码里的 Version 后对应版本要与你上面记下的版本一致):
- <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
- <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
- <dependency>
- <dependentAssembly>
- <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.1"
- processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
- </dependentAssembly>
- </dependency>
- <dependency>
- <dependentAssembly>
- <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" version="9.0.30729.1"
- processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
- </dependentAssembly>
- </dependency>
- <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
- <security>
- <requestedPrivileges>
- <requestedExecutionLevel level="asInvoker" uiAccess="false">
- </requestedExecutionLevel>
- </requestedPrivileges>
- </security>
- </trustInfo>
- </assembly>
以上运行库相关在 VS2008 SP1 和全新的 WinXP SP3 下测试通过