2

在应用程序的 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>

我相信这是一个 Windows 可执行应用程序清单,如 MSDN(应用程序清单)中所述:

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

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

4

1 回答 1

7

清单中出现的名称是一个逻辑名称。它不需要真正匹配 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 程序实际上都不重要。

于 2013-05-30T15:01:51.327 回答