【问题标题】:How to add an assembly manifest to a .NET executable?如何将程序集清单添加到 .NET 可执行文件?
【发布时间】:2011-11-15 19:12:39
【问题描述】:

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


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

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

  • 如果我想禁用 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 中将程序集清单添加到项目中?

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

奖金聊天


更新:Michael Fox 建议可以使用项目属性对话框来包含程序集清单,但他没有指出在哪里


更新:我尝试过的事情:

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

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

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

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

  • 资源下选择资源文件单选选项:

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

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

不起作用,因为 Visual Studio 在显示程序集清单时会阻塞

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

不起作用,因为 Visual Studio 在呈现资源脚本时会阻塞

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

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

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

【问题讨论】:

标签: visual-studio-2010 manifest fusion


【解决方案1】:

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

  1. 在解决方案资源管理器中右键单击项目。
  2. 点击“添加新项目”。
  3. 选择“应用程序清单文件”。

这会将一个名为 app.manifest 的文件添加到您的项目中,您可以根据需要打开和修改该文件。


类似的步骤,带截图,取自 MSDN 上的Declaring Managed Applications As DPI-Aware

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

  2. 添加新项目对话框中,选择Application Manifest File,然后点击Add。 app.manifest 文件出现。

  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. 在解决方案资源管理器中,右键单击 项目,然后单击 Properties 以验证是否使用了 app.manifest

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

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

【讨论】:

  • 您也可以通过这种方式将 app.manifest 嵌入到类库项目中,但由于类库项目的“清单”字段已禁用,因此无法确认是否已完成此操作。检查的唯一方法是在文本编辑器中查看项目文件并在 XML 中查找 ApplicationManifest 元素。为什么要在类库中嵌入清单?一个原因是用作托管隔离 COM 服务器。
【解决方案2】:

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

但是,如果我:

  1. 在解决方案资源管理器中找到添加的 app.manifest 文件
  2. 右键单击并选择属性
  3. 将 Build Action 属性从“None”更改为“Embedded Resource”
  4. 重建

清单文件已正确嵌入,我可以通过将 DLL 加载到资源视图中来验证这一点。应用程序属性中的清单设置仍显示为“使用默认设置嵌入清单”并且仍处于禁用状态。

【讨论】:

  • @Bart 不,正如莫里斯所解释的,它的附加信息。他以不同的方式解决问题。
【解决方案3】:

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

【讨论】:

  • 请截图步骤;我找不到这样的方法。
  • 我假设您知道如何将现有文件添加到 Visual Studio 项目。这是您访问项目属性和选择清单的方式。 imageshack.us/photo/my-images/155/manifest.png
  • 将链接的屏幕截图复制到原始问题中。
  • 我不确定如何才能更清楚地说明这一点。它就在屏幕截图中!在“图标和清单”单选按钮下 - “要嵌入自定义清单,首先将其添加到您的项目中,然后从下面的列表中选择它”。然后在“清单”下有一个组合框,您可以使用它来选择清单。要将清单添加到项目中,请像添加任何其他现有文件一样添加它。
  • 我添加了屏幕截图,显示为什么事情仍然不清楚。也许您可以添加一些屏幕截图,我们会看到缺少的部分在哪里。
猜你喜欢
  • 2010-11-28
  • 2015-12-01
  • 1970-01-01
  • 2010-11-25
  • 2012-01-04
  • 2011-02-06
  • 1970-01-01
相关资源
最近更新 更多