2014-10-07 61 views
0

我有一個應用程序以兩種方式進行部署,由管理員親自安裝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個場景:

  1. 應用程序不會明顯,沒有安裝的SxS - >應用程序加載本地dll的如果存在的話都失敗
  2. 應用程序清單,沒有安裝的SxS - >應用程序加載在本地如果dll的目前都失敗
  3. 應用程序沒有明顯的,目前的SxS - >

    A.應用程序加載的dll本地如果存在的話,DLL加載,然後從血散腐敗依賴的改變發生

    B.沒有本地的dll,應用程序失敗

  4. 應用程序清單,目前的SxS - >

    A.應用程序加載在本地如果存在DLL時,DLL加載,然後從血散腐敗依賴的改變發生

    B.沒有本地的dll,從血散所有應用程序加載非常

有2種情況,我需要做的工作:

  1. 僅在本地文件夾(在無血散)
  2. DLL在本地文件夾中的DLL和的SxS

我對應用程序清單和dllImport有完全的控制權,所以這裏所需的任何修改都在我的控制之下。與SxS中的dll場景無關。

回答

0

如何安裝本地程序集?您是否嘗試將它們安裝在程序集名稱文件夾中

yourapp.exe 
sharedSXS/ExternalDLL.dll 
sharedSXS/sharedSXS.manifest 
sharedSXS/OtherDLL.dll 

然後應用,而無需清單不會找到的所有DLL,並與清單應用程序之前,本地副本會選擇全球複製,從來沒有同時使用。

相關問題