在应用程序的Visual Studio项目属性中,有一个"创建没有清单的应用程序"选项.在通过ClickOnce部署应用程序时,此选项是必需的,但我不明白这个选项做了什么,到目前为止我的研究如下......
在禁用该选项并重新编译时,我注意到列出程序集内容的.NET程序集清单仍然完好无损且未更改.在比较二进制文件时(在Beyond Compare中使用Hex比较模式)我注意到这个块已经从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>
Run Code Online (Sandbox Code Playgroud)
我相信这是MSDN(应用程序清单)中描述的Windows可执行应用程序清单:
应用程序清单是一个XML文件,它描述和标识应用程序在运行时应绑定到的共享和私有并行程序集.
这里奇怪的是,上面的XML中的应用程序名称和版本似乎具有默认值(MyApp,版本1.0.0.0),而构建此二进制文件的Visual Studio项目具有正确的名称和版本号,因此它似乎对我来说,所有.NET二进制文件(或者无论如何都是EXE文件)都会嵌入相同的默认WindowsEXE清单.是这样吗?我应该在某处设置这些名称和版本值吗?
清单中显示的名称是逻辑名称.它不需要实际匹配EXE名称.在一种情况下,Windows只会使用您发现的描述,即"私有并排程序集"的情况.
并行程序集在使用DLL的非托管应用程序中很重要.它解决了DLL Hell问题,这样的应用程序不仅通过名称而且通过版本检索DLL.您可以在c:\ windows\winsxs中找到机器上存储这些"程序集"的位置.很少有商业程序实际上使用这个功能,这是一个很大的麻烦,利用和文档很差,你几乎只能在该目录中找到Microsoft DLL.它自Vista以来大量增加,操作系统DLL也存储在那里.
这听起来可能都很熟悉,.NET也有这样一个并排的目录.不存储在同一个地方而不使用相同的名称.我们称之为GAC,即全球大会缓存.底层管道在其他方面是相同的,但更容易利用,因为对Fusion api的支持直接在CLR中构建.并且不需要清单箍,.NET程序集已经在其程序集元数据中具有必要的属性.但是,对于清单执行的其他操作,.NET可执行文件中仍然需要清单.你发布的那个很重要,它告诉Windows你的程序是UAC知道的,并且当它执行诸如在HKLM中编写注册表项或将文件复制到c:\ windows之类的东西时不必撒谎.应用程序名称和版本是存在的,因为它不是可选的.
简而言之,清单中的名称和版本对.NET程序都不重要.
| 归档时间: |
|
| 查看次数: |
261 次 |
| 最近记录: |