1

In Asp.Net Core solution targeted to 4.6.1 full Framework I am using 2.1.1 Microsoft.Azure.ActiveDirectory.GraphClient.dll

In MSTest tests library TestMethods I am getting exception:

System.IO.FileLoadException: Could not load file or assembly 'Microsoft.Data.Services.Client, Version=5.6.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

The wild thing that nuspec requires version 5.6.4, but DLL actually references 5.6.3.

Extract from dotPeek:

// Assembly Microsoft.Azure.ActiveDirectory.GraphClient, Version=2.1.10.0, Culture=neutral, PublicKeyToken=null
// Assembly references:
// Microsoft.Data.Services.Client, Version=5.6.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// Microsoft.Data.Edm, Version=5.6.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// Microsoft.Data.OData, Version=5.6.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35

.nuget\packages\Microsoft.Azure.ActiveDirectory.GraphClient\2.1.1\Microsoft.Azure.ActiveDirectory.GraphClient.nuspec

 <dependencies>
      <dependency id="Microsoft.Data.Services.Client" version="5.6.4" />
      <dependency id="Microsoft.Data.Edm" version="5.6.4" />
      <dependency id="Microsoft.Data.OData" version="5.6.4" />
      <dependency id="System.Spatial" version="5.6.4" />
    </dependencies>

I've tried to install Microsoft.Data.Services.Client 5.6.3, but NuGet reported that Microsoft.Data.Odata requires 5.6.4
I've tried to install Microsoft.Data.Odata 5.6.3, but NuGet reported that Microsoft.Azure.ActiveDirectory.GraphClient require 5.6.4

I tried to use assemblyBinding, but it doesn't work for me (I've tried suggestions from assemblybinding does not work in mstest)

Any suggestions how to make Microsoft.Data.Services.Client loaded?
Can I somehow overwrite nuspec dependencies?

Update: I've created isolated library with single TestMethod, that has the problem.

The FIX: The problem was that in app.config in assemblyBinding/ bindingRedirect I've used File Version instead of Assembly Version, which is different for this assembly (File Version=5.6.4.62175, but Assembly Version=5.6.4.0). Correct configuration is

 <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Data.Services.Client" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.6.4.0" newVersion="5.6.4.0" />
      </dependentAssembly>
    </assemblyBinding>
Michael Freidgeim
  • 26,542
  • 16
  • 152
  • 170

1 Answers1

2

I am testing using Visual Studio 2017, and install the package Microsoft.Azure.ActiveDirectory.GraphClient with version 2.1.1. I also check the dependency version of Microsoft.Data.Services.Client is version 5.6.3 as you mentioned.

However, I also checked the version of Microsoft.Data.Services.Client.dll in the bin folder is 5.6.4.0 and it works well for me. Please use this version to see whether it is helpful.

And here is the part of deps.json file for your reference:

 {
      "runtimeTarget": {
        "name": ".NETFramework,Version=v4.6.1/win7-x86",
        "signature": "d7dc1119a66d1c2bf3e9f2c55e2b0432742f00d1"
      },
      "compilationOptions": {
        "defines": [
          "TRACE",
          "DEBUG",
          "NET461"
        ],
        "languageVersion": "",
        "platform": "x86",
        "allowUnsafe": false,
        "warningsAsErrors": false,
        "optimize": false,
        "keyFile": "",
        "emitEntryPoint": true,
        "xmlDoc": false,
        "debugType": "portable"
      },
      "targets": {
        ".NETFramework,Version=v4.6.1": {
          "consoleapp1/1.0.0": {
            "dependencies": {
              "Microsoft.AspNetCore.Server.Kestrel": "1.0.3",
              "Microsoft.Azure.ActiveDirectory.GraphClient": "2.1.1"
            },
            "compile": {
              "ConsoleApp1.exe": {}
            }
          },
          ...
          "microsoft.azure.activedirectory.graphclient/2.1.1": {
            "dependencies": {
              "Microsoft.Data.Edm": "5.6.4",
              "Microsoft.Data.OData": "5.6.4",
              "Microsoft.Data.Services.Client": "5.6.4",
              "System.Spatial": "5.6.4"
            },
            "compile": {
              "lib/portable-net4+sl5+win+wpa+wp8/Microsoft.Azure.ActiveDirectory.GraphClient.dll": {}
            }
          },
          "microsoft.data.edm/5.6.4": {
            "compile": {
              "lib/net40/Microsoft.Data.Edm.dll": {}
            }
          },
          "microsoft.data.odata/5.6.4": {
            "dependencies": {
              "Microsoft.Data.Edm": "5.6.4",
              "System.Spatial": "5.6.4"
            },
            "compile": {
              "lib/net40/Microsoft.Data.OData.dll": {}
            }
          },
          "microsoft.data.services.client/5.6.4": {
            "dependencies": {
              "Microsoft.Data.OData": "5.6.4"
            },
            "compile": {
              "lib/net40/Microsoft.Data.Services.Client.dll": {}
            }
          },
         ...
        }
      }
    }

Update

For the redirecting assembly in a unit test project, add the config like steps below:

1 .add a config file testAssemblyName.dll.config(eg. my project's name is ConsoleApp1.Test then the config file should be ConsoleApp1.Test.dll.config) with content below:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Data.Services.Client" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.6.4.0" newVersion="5.6.4.0" />
      </dependentAssembly>
    </assemblyBinding>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Data.OData" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.6.4.0" newVersion="5.6.4.0" />
      </dependentAssembly>
    </assemblyBinding>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Data.Edm" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.6.4.0" newVersion="5.6.4.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
  1. change the property Copy to Output Directory with the value Copy if newer to make sure that the config is copy to the bin/debug folder.

After that the tests run successfully.

Fei Xue
  • 14,369
  • 1
  • 19
  • 27
  • Have you used an exe or MSTest tests library? I've created isolated library with single TestMethod, that still has the same problem (https://github.com/MNF/Samples/tree/master/UnitTestProjectVS2017_AADGraphClient). Also I couldn't see deps.json file (I've tried PreserveCompilationContext both true and false) – Michael Freidgeim Jul 23 '17 at 07:24
  • Yes, I tested in an .net core console app( works well since there is a config for the redirecting assembly). And then I test this issue in a unit test and able to reproduce this issue. After I add the config for redirecting assembly, the issue was fixed. Please see the updated post for the detail. – Fei Xue Jul 24 '17 at 06:06
  • @MichaelFreidgeim Is the issue fixed? – Fei Xue Jul 25 '17 at 06:25
  • Yes, the problem was that I've used version="5.6.4.62175" that was shown as file version and product version in file explorer DLL properties and it was ignored. When I changed to "5.6.4.0" as in your snippet, it's working. Thanks. – Michael Freidgeim Jul 25 '17 at 07:33
  • This solution works very well in my console app, however, when I tried to do the same thing in web.config from an asp.net web form project, it doesn't work over there :( – Drex Sep 24 '19 at 18:40