我有一个以两种方式部署的应用程序,管理员亲自安装一个WiX安装程序,或者没有提升权限的用户单击一次安装程序。它依赖于一组设计为以SxS方式部署的第三方dll。但是,由于需要提升安装到winSxS的权限,所以单击一次安装需要将文件本地安装到应用程序的bin目录。这在WiX安装中也是可能的,并且不会引起任何问题,但是有一个问题……
使用同一组dll的其他第三方(或第4方)应用程序将它们安装到winSxS中,并且当我们的应用程序加载时,它会访问本地版本和winSxS中的版本。这会导致SxS dll从非托管资源dll加载的资源出现一些奇怪的UI损坏。
更复杂的是,来自第三方的共享SxS集中的所有all都嵌入了一个清单,该清单直接指定了对SxS集的依赖。
我尝试在应用程序清单中添加对SxS集的依赖关系,但问题仍然存在,这两个版本都被访问:
<dependency>
<dependentAssembly>
<assemblyIdentity name="sharedSXS" version="12.1.369.0" publicKeyToken="1255b113b2b03444" type="win32"/>
</dependentAssembly>
</dependency>但最高层没有效果。
我的问题是:
如果计算机上没有安装其他应用程序,并且dll位于应用程序bin目录中,是否有方法继续成功运行应用程序;如果另一个应用程序将dll安装到winSxS中,也可以成功运行。换句话说,我是否可以强迫应用程序完全从winSxS或本地加载,这在无论是否存在winSxS的情况下都是存在的。
额外信息
应用程序使用dllImport访问dll:
[DllImport("ExternalDll.dll", EntryPoint = "_DoStuff@12")]
[CLSCompliantAttribute(false)]
public static extern IntPtr DoStuffEx(string name, string reserved, uint uiFlags);而dll具有嵌入的清单:
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="ExternalDLL.dll" processorArchitecture="x86" type="win32" version="12.0.0.0"></assemblyIdentity>
<dependency>
<dependentAssembly>
<assemblyIdentity name="sharedSXS" version="12.1.369.0" publicKeyToken="1255b113b2b03444" type="win32"/>
</dependentAssembly>
</dependency>
</assembly>SxS宣言如下所示:
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32" name="sharedSXS" version="12.1.369.0" publicKeyToken="1255b113b2b03444"></assemblyIdentity>
<file name="ExternalDLL.dll" hashalg="SHA1" hash="cb2ecfaca2d62cd9f5c559cf21d502921881155f"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>BLyJ40vJD++ih9XTg0oOcZhISl4=</dsig:DigestValue></asmv2:hash></file>
<file name="OtherDLL.dll" hashalg="SHA1" hash="246d082823724f42d5630dba1b9dcde3e2c1b76d"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>me1EL8p76nkfD1o9L058m8GUdaw=</dsig:DigestValue></asmv2:hash></file>
</assembly>有4种情况:
有两种方案需要我发挥作用:
我完全控制了应用程序清单和dllImport,所以这里需要的任何修改都在我的控制之下。仅在SxS中使用dll的场景是不相关的。
发布于 2014-10-15 15:50:09
如何安装本地程序集?您试过在程序集名称文件夹中安装它们吗?
yourapp.exe
sharedSXS/ExternalDLL.dll
sharedSXS/sharedSXS.manifest
sharedSXS/OtherDLL.dll那么,没有清单的应用程序将根本找不到dll,而带有清单的应用程序在本地复制之前更倾向于全局复制,永远不会同时使用。
https://stackoverflow.com/questions/26238940
复制相似问题