首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制应用程序忽略本地程序集并使用SxS,反之亦然

强制应用程序忽略本地程序集并使用SxS,反之亦然
EN

Stack Overflow用户
提问于 2014-10-07 14:55:09
回答 1查看 531关注 0票数 1

我有一个以两种方式部署的应用程序,管理员亲自安装一个WiX安装程序,或者没有提升权限的用户单击一次安装程序。它依赖于一组设计为以SxS方式部署的第三方dll。但是,由于需要提升安装到winSxS的权限,所以单击一次安装需要将文件本地安装到应用程序的bin目录。这在WiX安装中也是可能的,并且不会引起任何问题,但是有一个问题……

使用同一组dll的其他第三方(或第4方)应用程序将它们安装到winSxS中,并且当我们的应用程序加载时,它会访问本地版本和winSxS中的版本。这会导致SxS dll从非托管资源dll加载的资源出现一些奇怪的UI损坏。

更复杂的是,来自第三方的共享SxS集中的所有all都嵌入了一个清单,该清单直接指定了对SxS集的依赖。

我尝试在应用程序清单中添加对SxS集的依赖关系,但问题仍然存在,这两个版本都被访问:

代码语言:javascript
复制
<dependency>
    <dependentAssembly>
        <assemblyIdentity name="sharedSXS" version="12.1.369.0" publicKeyToken="1255b113b2b03444" type="win32"/>
    </dependentAssembly>
</dependency>

但最高层没有效果。

我的问题是:

如果计算机上没有安装其他应用程序,并且dll位于应用程序bin目录中,是否有方法继续成功运行应用程序;如果另一个应用程序将dll安装到winSxS中,也可以成功运行。换句话说,我是否可以强迫应用程序完全从winSxS或本地加载,这在无论是否存在winSxS的情况下都是存在的。

额外信息

应用程序使用dllImport访问dll:

代码语言:javascript
复制
[DllImport("ExternalDll.dll", EntryPoint = "_DoStuff@12")]
[CLSCompliantAttribute(false)]
public static extern IntPtr DoStuffEx(string name, string reserved, uint uiFlags);

而dll具有嵌入的清单:

代码语言:javascript
复制
<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宣言如下所示:

代码语言:javascript
复制
<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. 应用程序有清单,如果当前->失败,则未安装的->应用程序将本地加载dll。
  3. 应用程序没有清单,SxS表示-> A.应用程序在本地加载dll如果存在,dll然后从SxS损坏中加载依赖项 没有本地dll,应用程序失败
  4. 应用程序有清单,SxS表示-> A.应用程序在本地加载dll如果存在,dll然后从SxS损坏中加载依赖项 没有本地dll,从SxS加载的应用程序都很好

有两种方案需要我发挥作用:

  1. dll仅在本地文件夹中(SxS中无)
  2. 本地文件夹和SxS中的dll

我完全控制了应用程序清单和dllImport,所以这里需要的任何修改都在我的控制之下。仅在SxS中使用dll的场景是不相关的。

EN

回答 1

Stack Overflow用户

发布于 2014-10-15 15:50:09

如何安装本地程序集?您试过在程序集名称文件夹中安装它们吗?

代码语言:javascript
复制
yourapp.exe
sharedSXS/ExternalDLL.dll
sharedSXS/sharedSXS.manifest
sharedSXS/OtherDLL.dll

那么,没有清单的应用程序将根本找不到dll,而带有清单的应用程序在本地复制之前更倾向于全局复制,永远不会同时使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26238940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档