我们有一个“脱机”的 Windows 应用程序,它将ASP.NET应用程序包装在 Windows 窗体内的 Internet Explorer 控件中。因此,我们在应用程序文件夹中有一个子树,它是整个在线/Web 应用程序,它在包装离线应用程序 EXE 文件中启动和运行。
这导致一些程序集既作为脱机应用程序 EXE 文件的直接引用,又作为联机应用程序子文件夹的一部分。通过手动复制整个应用程序文件夹树来部署应用程序时,这可以正常工作。但是,在验证 ClickOnce 应用程序清单时,ClickOnce 部署在安装时失败 - 如果我从在线应用程序子树中删除这些程序集(在根文件夹)并在没有它们的情况下重建/签署应用程序清单,然后验证成功并安装应用程序 - 但当然没有我删除的程序集。
=== 更新 ===
为.NET 4提供了新版本的 mage.exe (较新的副本是 Windows SDK v7.1 的一部分 - 在 NETFX 4.0 工具文件夹中),新版本对重复程序集表现出不同的行为。
在Mage v3.x 创建的应用程序清单中,重复项使用“文件”元素列出,如下所示:
<file name="foo.dll" size="123456">
<hash>
<dsig:Transforms>
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
</dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<dsig:DigestValue>JFifxtn6vhCtaiom4tzJ+pcgqT0=</dsig:DigestValue>
</hash>
</file>
并生成以下形式的警告:
警告 MSB3178:Assembly'\AppFiles\fooApp_2.9.186.3\foo.dll' 被错误地指定为文件。
事实上,这两个重复文件都是这样列出的,也就是说,两个文件都没有被列为“dependentAssembly”,这显然是错误的。
但是,Mage v4 为文件和表单警告创建了一个“dependentAssembly”条目:
警告 MSB3112:两个或多个程序集具有相同的标识 'foo,Version=1.0.0.0,Culture=neutral,PublicKeyToken=0123456789012345,ProcessorArchitecture=msil'。
除了路径(在“代码库”属性上定义)之外,这两个条目是相同的,但在安装时,如果部署包含此类条目并出现模糊错误,则 ClickOnce 安装程序将失败:
清单可能无效或文件无法打开。