我有一個應用程序以兩種方式進行部署,由管理員親自安裝WiX安裝程序,或由不具有提升特權的用戶單擊一次安裝程序。它依賴於一組旨在以SxS方式部署的第三方dll。但是,由於需要提升特權才能安裝到winSxS,所以單擊一次安裝需要將文件本地安裝到應用程序的bin目錄。這在WiX安裝中也是可能的,並且不會造成任何問題,但是存在問題...強制應用程序忽略本地程序集並使用SxS或反之亦然
使用同一套dll的其他第三方(或第四方)應用程序將它們安裝到winSxS中,並且當我們的應用程序加載它在winSxS中訪問本地版本和版本。這導致一些奇怪的UI腐敗方面的資源從SxS dll從非託管資源DLL加載。
使問題變得複雜的事情從第三方共享的SxS集合中的所有dll都有一個嵌入式清單,它指定直接依賴於SxS集合。
我已經嘗試添加應用程序清單上設置的SxS的依賴,但問題仍然存在,這兩個版本的訪問:
<dependency>
<dependentAssembly>
<assemblyIdentity name="sharedSXS" version="12.1.369.0" publicKeyToken="1255b113b2b03444" type="win32"/>
</dependentAssembly>
</dependency>
但頂部無濟於事。
我的問題是這樣的:
有沒有辦法繼續成功地運行應用程序,如果沒有其他的應用程序安裝在機器上和DLL是在應用程序bin目錄中,同時也運行成功,如果其他應用程序安裝將dll轉換爲winSxS。 換句話說,我是否可以強制應用程序從winSxS或本地加載,而在winSxS中存在dll的兩種情況下都存在。
額外的資訊
的應用程序訪問使用的DllImport的DLL:
[DllImport("ExternalDll.dll", EntryPoint = "[email protected]")]
[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個場景:
- 應用程序不會明顯,沒有安裝的SxS - >應用程序加載本地dll的如果存在的話都失敗
- 應用程序清單,沒有安裝的SxS - >應用程序加載在本地如果dll的目前都失敗
應用程序沒有明顯的,目前的SxS - >
A.應用程序加載的dll本地如果存在的話,DLL加載,然後從血散腐敗依賴的改變發生
B.沒有本地的dll,應用程序失敗
應用程序清單,目前的SxS - >
A.應用程序加載在本地如果存在DLL時,DLL加載,然後從血散腐敗依賴的改變發生
B.沒有本地的dll,從血散所有應用程序加載非常
有2種情況,我需要做的工作:
- 僅在本地文件夾(在無血散)
- DLL在本地文件夾中的DLL和的SxS
我對應用程序清單和dllImport有完全的控制權,所以這裏所需的任何修改都在我的控制之下。與SxS中的dll場景無關。