windowsassembliesgdi+versioningwinsxs

WinSxS: How to take dependency on specific version of gdiplus.dll?


I need to add a dependency on a specific version of GDIPlus. This is the version of GDI+ that i want:

alt text

I want to be sure that I'm using this version for a specific compatibility reason.

I've added an assembly manifest to my executable, defining my dependancy on the version of GdiPlus:

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

Except when I run my application, Windows' fusion loader gives me some other version of gdiplus.dll from the Side-by-Side folder, which I can see in Process Explorer:

alt text

It's giving me version 5.02.6002.18005, rather than 5.1.3102.2180.

So the question is: How do I take a dependency on a specific version of a Windows dll?


Solution

  • Your "problem", such that it is, is that there is a policy file installed that specifies that requests for 5.1.3102.2180 can be redirected to 5.02.6002.18005

    This is, usually, a good thing. it lets applications specify the version they were built against in their manifest, but when critical security fixes are introduced, the OS can redirect apps to compatible versions.

    So, whats going to happen here is, your app is going to link against GDI+ 5.1 on any PC that has only 5.1 installed. but any PCs with the 5.2 GDI+, you will be redirected to that.

    If you do have an honest to goodness reason why you want to use 5.1, even when 5.2 is available... I think you can use an application config file to manage that.

    Create a file called, yourapp.exe.config - if the module in your app thats importing GDI+ is a dll, then it would be thedll.dll.2.config

    I am unsure how to structure the bindingRedirect however. i.e. given the policy files redirection, im not sure if you need to redirect the old version back to itself, or the new version back to the old version. or what. some trial and error might be required.

    The data in the .config file looks almost exactly like the data in the manifest file. Something like this (which mimics almost exactly the contents of the policy file installed in winsxs thats doing the redirection you dont want).

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

    To make the choice of "oldVersion" easier, it supports a range syntax. so

    oldVersion="5.0.0.0-5.3.0.0"
    

    would be a simple way to ensure that a whole range of GdiPlus versions get redirected to a specific version.