附加到.net程序集的Windows EXE应用程序清单是否具有适当的应用程序名称和版本集



在应用程序的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清单。是这样吗?我应该在某个地方设置这些名称和版本值吗?

在清单中显示的名称是一个逻辑名称。它不需要实际匹配EXE名称。它只在你找到的描述中提到的一种场景中被Windows使用,即"私有并排程序集"的情况。

在使用dll的非托管应用程序中,

并行程序集很重要。它解决了一个DLL地狱的问题,这样的应用程序检索DLL不只是名称,但也版本。您将在c:windowswinsxs中找到这些"程序集"存储的位置。很少有商业程序真正使用这个特性,要利用它是相当令人头疼的,而且文档也很差,你几乎只能在那个目录中找到微软的dll。自Vista以来,它的体积增大了很多,操作系统dll也存储在那里。

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

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

最新更新