Search code examples
.net-assemblygacgacutilpublisher-policy

My policy redirection on GAC is not working


I created a basic project in WinForms on which I have a .exe that loads a really simple library:

The .exe:

    public Form1()
    {
        InitializeComponent();
        int a;
        int b;
        a = 7;
        b = 3;
        MessageBox.Show(Sumar.SumResult(a, b));
    }

The library:

public class Sumar
{
    public static string SumResult(int a, int b)
    {
        return (a + b).ToString(CultureInfo.InvariantCulture);
    }
}

Really simple. The assembly for the first version of the library:

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Then I installed v1.0.0.0 on GAC:

gacutil -i TestLibrary.dll

I changed code on the library to be different:

public class Sumar
{
    public static string SumResult(int a, int b)
    {
        return (a - b).ToString(CultureInfo.InvariantCulture);
    }
}

And changed assembly version to 1.0.0.1. Then I installed that library to GAC.

The .exe is still consuming 1.0.0.0 .dll, so I create a policy to use v1.0.0.1 instead:

al /link:test.1.0.config /out:policy.1.0.TestLibrary.dll /keyfile:sgKey.snk /platform:x86

Where the .config looks like this:

<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="TestLibrary"
                      publicKeyToken="a96822fc2f88c1d9"
                      cultures="neutral" />
    <bindingRedirect oldVersion="1.0.0.0" newVersion="1.0.0.1" />
  </dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

After that, I install the policy to GAC:

gacutil /i policy.1.0.TestLibrary.dll

And it says Assembly successfully added to the cache, but my .exe is still using v1.0.0.0.

So, Why didn't my redirect work?


Solution

  • The problem was that the Policy was correct, but the Major and Minor versions were not the same that the one on the .dll, and that's why it didn't work.