我们有一个``离线''Windows应用程序,该应用程序将ASP.NET应用程序包装在Windows窗体的Internet Explorer控件中。因此,我们在应用程序文件夹中有一个子树,它是整个在线/ Web应用程序,并且它在包装的脱机应用程序EXE文件中启动并运行。
这导致一些程序集既可以作为脱机应用程序EXE文件的直接引用,又可以用作在线应用程序子文件夹的一部分。通过对整个应用程序文件夹树进行手动复制来部署应用程序时,这可以很好地工作。但是,在验证ClickOnce应用程序清单时,ClickOnce部署在安装时失败-如果我从在线应用程序子树中删除了这些程序集,则我将重复程序集作为问题解决了(如果仅将每个程序集的一个副本留在根文件夹)并在没有它们的情况下重建/签名应用程序清单,然后验证成功并安装了应用程序-但当然没有我删除的程序集。
===更新===
为.NET 4提供了新版本的mage.exe(较新的副本是Windows SDK v7.1的一部分-在NETFX 4.0 Tools文件夹中),并且新版本对重复的程序集表现出不同的行为。
在Mage v3.x创建的应用程序清单中,使用'file'元素列出重复项,如下所示:
<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:程序集'\ AppFiles \ fooApp_2.9.186.3 \ foo.dll'被错误地指定为文件。
实际上,两个重复文件都是这样列出的,也就是说,两个文件都没有列出为“ dependentAssembly”,这显然是错误的。
但是,Mage v4会为文件和以下形式的警告创建一个“ dependentAssembly”条目:
警告MSB3112:两个或多个程序集具有相同的标识'foo,版本= 1.0.0.0,区域性=中性,PublicKeyToken = 12345678912345,ProcessorArchitecture = msil'。
除路径(在'codebase'属性上定义)外,这两个条目相同,但是在安装时,如果部署包含带有模糊错误的条目,则ClickOnce安装程序将失败:
清单可能无效或无法打开文件。
最佳答案
您必须重命名其中任何一个并使用。还要为每个程序集尝试不同的版本和公钥令牌