如何将程序集清单添加到.NET可执行文件?

时间:2011-11-15 19:12:39

标签: visual-studio-2010 manifest fusion

如何将程序集清单添加到.NET可执行文件中?


程序集清单是一个XML文件,它添加到资源类型为RT_MANIFEST的.NET可移植可执行文件(PE)中(24)。

程序集清单用于声明有关可执行文件的许多内容,例如:

  • 如果我想禁用DPI扩展,因为我是一名优秀的开发人员:

    <!-- We are high-dpi aware on Windows Vista -->
    <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
       <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
          <dpiAware>true</dpiAware>
       </asmv3:windowsSettings>
    </asmv3:application>
    
  • 我可以声明我是在Windows 7上设计和测试的,我应该继续依赖Windows 7中的任何错误

    <!-- We were designed and tested on Windows 7 -->
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
       <application>
          <!--The ID below indicates application support for Windows 7 -->
          <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
       </application>
    </compatibility>
    
  • 我可以声明我是一名优秀的开发人员,并且不需要文件和注册表虚拟化

    <!-- Disable file and registry virtualization -->
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
       <security>
          <requestedPrivileges>
             <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
          </requestedPrivileges>
       </security>
    </trustInfo>
    
  • 我可以声明我依赖于 Microsoft Common Controls 库的特定版本6:

    <!-- Dependency on Common Controls version 6 -->
    <dependency>
       <dependentAssembly>
          <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="X86"
                publicKeyToken="6595b64144ccf1df"
                language="*"/>
       </dependentAssembly>
    </dependency>
    
  • 我可以声明我依赖于特定版本的GDI +:

    <dependency>
       <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.Windows.GdiPlus" version="1.0.0.0" processorArchitecture="x86"
                publicKeyToken="6595b64144ccf1df" language="*" />
       </dependentAssembly>
    </dependency>
    

In the olden days,我们会创建资源脚本文件(*.rc),例如:

wumpa.rc

   1    24    AssemblyManifest.xml

将该文件添加到项目中,编译器将编译.rc文件;包括最终可执行映像中的资源。

Visual Studio 2010 doesn't seem to have a way to add a resource script file to a project除外。

如何在Visual Studio 2010中向项目添加资源脚本?

如何在Visual Studio 2010中向项目添加程序集清单?

注意:任何解决方案都必须在具有源代码控制和多个开发人员的环境中工作(例如,可能未安装二进制文件的硬编码路径会破坏构建并且无法正常工作)。

Bonus Chatter


更新:Michael Fox建议项目属性对话框可用于包含程序集清单,但他没有指出 where

enter image description here


更新:我尝试过的事情:

  • 从项目属性屏幕中,选择应用程序。选择广播选项图标和清单。在清单下,保留默认选项Embed manifest with default settings

enter image description here

不起作用,因为它嵌入了带有默认设置的清单,而不是我的设置。

  • 清单下,将组合选项更改为Create application without a manifest

    enter image description here

    不起作用,因为它没有嵌入

  • 资源下,选择资源文件广播选项:

    enter image description here

    不起作用,因为您无法选择程序集清单(或包含程序集清单的资源脚本)

  • 资源下,选择资源文件单选项,然后输入程序集清单XML文件的路径:

enter image description here

不起作用,因为Visual Studio在使用程序集清单时会出现阻塞:

enter image description here

  • 资源下,选择资源文件单选项,然后输入资源脚本文件的路径:

enter image description here

不起作用,因为当使用资源脚本时,Visual Studio会阻塞:

enter image description here

  • AssemblyManifest.xml添加到我的项目中,然后在 Manifest 组合框中查找:

    enter image description here

    不起作用,因为Assembly Manifest文件未列为选项

  

我还有其他一些可以保持截图的内容(在解决方案中添加.rc文件,在下拉列表中查找,选择“no manifest”并将wumpa.rc构建操作更改为各种内容,构建.rc文件使用单独的资源编译器,手动或预构建/ msbuild步骤,并选择.res文件作为我的资源)。我将停止为我的问题增加额外的批量,并希望得到答案。

3 个答案:

答案 0 :(得分:26)

如果要将自定义信息添加到应用程序的清单中,可以按照以下步骤操作:

  1. 在解决方案资源管理器中右键单击项目。
  2. 点击“添加新项目”。
  3. 选择“应用程序清单文件”。
  4. 这会将名为app.manifest的文件添加到您的项目中,您可以根据需要打开和修改该文件。


    类似的步骤,屏幕截图,从MSDN上的Declaring Managed Applications As DPI-Aware解除:

    1. 在解决方案资源管理器中,右键单击项目,指向添加,然后单击新项

    2. 添加新项对话框中,选择应用程序清单文件,然后单击添加。将出现app.manifest文件。

      enter image description here

    3. 将以下文本复制并粘贴到 app.manifest 文件中,然后保存。

      <?xml version="1.0" encoding="utf-8"?>
      <asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" 
                      xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" 
                      xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" 
                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      
        <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
      
          <!-- Disable file and registry virtualization. -->
          <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
            <security>
              <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
               <requestedExecutionLevel level="asInvoker" uiAccess="false" />
               <!--  <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
                     <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
                     <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />
               -->
              </requestedPrivileges>
            </security>
          </trustInfo>
      
          <!-- We are high-dpi aware on Windows Vista -->
          <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
            <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
              <dpiAware>true</dpiAware>
            </asmv3:windowsSettings>
          </asmv3:application>
      
          <!-- Declare that we were designed to work with Windows Vista and Windows 7-->
          <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
            <application>
              <!--The ID below indicates application support for Windows Vista -->
              <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
              <!--The ID below indicates application support for Windows 7 -->
              <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
            </application>
          </compatibility>
      
          <!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->
          <dependency>
            <dependentAssembly>
              <assemblyIdentity
                  type="win32"
                  name="Microsoft.Windows.Common-Controls"
                  version="6.0.0.0"
                  processorArchitecture="*"
                  publicKeyToken="6595b64144ccf1df"
                  language="*"
              />
            </dependentAssembly>
          </dependency>
      
        </asmv1:assembly>
      
    4. 在解决方案资源管理器中,右键单击项目,然后单击属性以验证 app.manifest 使用。

      enter image description here

    5. 您的应用程序现在表现为“为Windows设计”,并且

      • 禁用文件和注册表虚拟化
      • 禁用应用程序的DWM缩放
      • 宣布您是在Windows 7和Windows Vista上设计和测试的
      • 依赖于Common Controls库版本6(允许通用控件使用视觉样式)

答案 1 :(得分:6)

我安装了Service Pack 1的Visual Studio 2010 Professional。我在Windows 7旗舰版64位上运行。如果我按照这些说明操作,项目属性会在资源块中显示“使用默认设置嵌入清单”,并且该选项也会被禁用!当我构建时,清单不会嵌入到DLL中,因为我通过在资源视图中打开DLL来验证。

但是,如果我:

  1. 在解决方案资源管理器
  2. 中找到添加的app.manifest文件
  3. 右键单击并选择“属性”
  4. 将Build Action属性从“None”更改为“Embedded Resource”
  5. 重建
  6. 清单文件已正确嵌入,我可以通过将DLL加载到资源视图来验证。 “应用程序”属性中的“清单”设置仍显示为“使用默认设置嵌入清单”,但仍处于禁用状态。

答案 2 :(得分:2)

在Visual Studio 2008中,可以在“项目属性”窗口中完成此操作。我几乎肯定它在2010年是相同的。右键单击您的项目,选择属性,然后在应用程序选项卡中,您可以选择清单。您必须先将它添加到项目中,但您可以通过添加现有文件轻松完成。