【问题标题】:Should the Windows EXE application manifest attached to a .NET assembly have a proper application name and version set?附加到 .NET 程序集的 Windows EXE 应用程序清单是否应该具有正确的应用程序名称和版本集?
【发布时间】:2013-05-30 10:53:15
【问题描述】:

在应用程序的 Visual Studio 项目属性中,有一个选项可以“创建没有清单的应用程序”。这个选项在通过ClickOnce部署应用的时候是必须的,但是我不明白这个选项有什么作用,目前我的研究如下……

在禁用该选项并重新编译时,我注意到列出程序集内容的 .NET 程序集清单仍然完好无损并且没有更改。在比较二进制文件时(在Beyond Compare 中使用十六进制比较模式),我注意到这个块已从 EXE 图像的末尾删除:

<?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" name="MyApplication.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

我相信这是 MSDN (Application Manifests) 上描述的 Windows 可执行应用程序清单:

应用程序清单是一个 XML 文件,用于描述和标识 应用程序的共享和私有并行程序集 应该在运行时绑定到。

这里奇怪的是,上述 XML 中的应用程序名称和版本似乎具有默认值(MyApp,版本 1.0.0.0),而构建此二进制文件的 Visual Studio 项目定义了正确的名称和版本号,所以 似乎 在我看来,所有 .NET 二进制文件(或 EXE 文件)都嵌入了相同的默认 WindowsEXE 清单。是这样吗?我应该在某处设置这些名称和版本值吗?

【问题讨论】:

    标签: .net exe


    【解决方案1】:

    清单中出现的名称是一个逻辑名称。它不需要真正匹配 EXE 名称。 Windows 仅在您找到的描述中提到的一种情况下使用它,即“私有并行程序集”情况。

    并行程序集在使用 DLL 的非托管应用程序中很重要。它解决了 DLL Hell 问题,此类应用程序不仅通过名称检索 DLL,还通过版本检索 DLL。您可以在计算机上的 c:\windows\winsxs 中找到这些“程序集”的存储位置。很少有商业程序真正使用此功能,利用起来相当头疼,而且文档很差,您几乎只能在该目录中找到 Microsoft DLL。从 Vista 开始,它变得相当庞大,操作系统 DLL 也存储在那里。

    这对您来说可能听起来很熟悉,.NET 也有这样一个并排的目录。不存储在同一个地方,不使用相同的名称。我们称之为 GAC,即全局程序集缓存。底层管道在其他方面是相同的,但非常更容易利用,因为对 Fusion api 的支持是直接在 CLR 中构建的。并且不需要清单 hoopla,.NET 程序集在其程序集元数据中已经具有必要的属性。然而,对于清单所做的其他事情,.NET 可执行文件中仍然需要清单。您发布的内容很重要,它告诉 Windows 您的程序可以识别 UAC,并且在执行诸如在 HKLM 中写入注册表项或将文件复制到 c:\windows 等操作时不必被欺骗。应用程序名称和版本在那里,因为它不是可选的。

    长话短说,清单中的名称和版本对于 .NET 程序实际上都不重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多