windows - WinSxS:如何依赖特定版本的 gdiplus.dll?

标签 windows assemblies gdi+ versioning winsxs

我需要添加对特定版本的 GDIPlus 的依赖。这是我想要的 GDI+ 版本:

alt text

我想确定我使用这个版本是出于特定的兼容性原因。

我已经在我的可执行文件中添加了一个程序集 list ,定义了我对 GdiPlus 版本的依赖:

<dependency>
   <dependentAssembly>
      <assemblyIdentity 
            type="win32" name="Microsoft.Windows.GdiPlus" 
            pubicKeyToken="6595b64144ccf1df" 
            version="5.1.3102.2180" processorArchitecture="x86"
            language="*" />
   </dependentAssembly>
</dependency>

除了当我运行我的应用程序时,Windows 的融合加载器从 Side-by-Side 文件夹中给我一些其他版本的 gdiplus.dll,我可以在 Process Explorer 中看到:

alt text

它给我的版本是 5.02.6002.18005,而不是 5.1.3102.2180

所以问题是:如何依赖特定版本的 Windows dll?

最佳答案

你的“问题”是安装了一个策略文件,指定对 5.1.3102.2180 的请求可以重定向到 5.02.6002.18005

这通常是一件好事。它允许应用程序在其 list 中指定构建时所针对的版本,但在引入关键安全修复程序时,操作系统可以将应用程序重定向到兼容版本。

因此,这里将要发生的是,您的应用程序将链接到任何仅安装了 5.1 的 PC 上的 GDI+ 5.1。但是任何带有 5.2 GDI+ 的 PC,你都会被重定向到那个。

即使 5.2 可用,如果您确实有充分的理由要使用 5.1...我认为您可以使用应用程序配置文件来管理它。

创建一个名为 yourapp.exe.config 的文件 - 如果您的应用程序中导入 GDI+ 的模块是一个 dll,那么它将是 thedll.dll.2.config

但是我不确定如何构造 bindingRedirect。即给定策略文件重定向,我不确定您是否需要将旧版本重定向回自身,或者将新版本重定向回旧版本。或者是什么。可能需要一些试验和错误。

.config 文件中的数据看起来几乎与 list 文件中的数据完全一样。像这样的东西(它几乎完全模仿了安装在 winsxs 中的策略文件的内容,这就是你不想要的重定向)。

<configuration>
  <windows>
    <assemblyBinding xmlns=...>
      <dependentAssembly name="GdiPlus...>
        <bindingRedirect oldVersion="5.1.x.x" newVersion="5.1.x.x"/>

为了让“oldVersion”的选择更容易,它支持范围语法。所以

oldVersion="5.0.0.0-5.3.0.0"

将是确保将整个 GdiPlus 版本范围重定向到特定版本的简单方法。

关于windows - WinSxS:如何依赖特定版本的 gdiplus.dll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1381028/

相关文章:

c# - InternalsVisibleTo 导致 CS0246 错误 : The Type or Namespace could not be found

.net - 解析/使用来自 3rd 方依赖项的多个程序集版本

c++ - 通过映射到的地址获取映射到内存中的文件名

c - C 可变参数是否使用名为 'end' 的关键字?

c++ - Cocos2d-x 缺少 sys/socket.h

windows - Perl 内存不足

c# - 在 SQL Server 2008 R2 中创建程序集时出错

c# - 如何调整颜色的亮度?

c# - 将 TIFF 保存到流时参数无效

c++ - 将字形索引转换为 Unicode 字符