1
votes

In my solution I have an ASP.NET Core 2 MVC app using Razor pages, a Web API 2 app and a .NET 4.7.1 class library containing services and their definitions that use Azure Table Storage from the Azure Storage NuGet (v8.7.0). I'm using autofac for dependency injection.

I have hooked up both my web apps to use classes from my library using Autofac's dependency injection. The Web API app works fine but the Core app doesn't. When I build without installing the Azure Storage NuGet package into the Core app I get the following error:

X.Library' with identity 'X.Library, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' uses 'Microsoft.WindowsAzure.Storage, Version=8.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' which has a higher version than referenced assembly 'Microsoft.WindowsAzure.Storage' with identity 'Microsoft.WindowsAzure.Storage, Version=8.1.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35

Which leads me to believe that ASP.NET Core 2 apps have Azure Storage pre-installed - I can't find any reference to it in the project though! Weird.

So I have tried to fixed this by installing the Azure Storage (v8.7.0) package which matches the version installed in the library I am using into my Core app. The app now builds and my dependencies are injected but when I try to use them I get MissingMethodExceptions for the methods CreateIfNotExists and CreateQuery. While my Web API app can query Azure Table Service my Core app can't use the same methods to do so.

After some research it seems that the ASP.NET Core implementation of the Azure Storage library has removed some synchronous methods and at runtime it uses this version rather than the .NET Framework compatible version my library references.

  1. Is there any way to remove Azure Storage from the ASP.NET Core 2 app? Is it preinstalled, as I suspect?
  2. I guess the easiest way to fix it is to use methods that are present in the Framework and Core implementations, is this how you'd fix it?
1
I haven't had a chance to completely research this yet, but according to the apisof.net page for Microsoft.WindowsAzure.Storage, it's not supported by .NET Core unless you have the Platform Extensions package included. Presumably because (as the name implies that it includes Windows specific APIs and methods).Jamie Taylor
Could you create a .NET Standard class library which has a dependency on Microsoft.WindowsAzure.Storage and consume that in your application?Jamie Taylor
Thanks Jamie, I'll give that a go.James Mundy
Actually that won't work due to the .NET Framework app.James Mundy
@JamesMundy - All versions of .NET Standard support .NET Framework 4.7.1 client assemblies. What is the problem that you are running into?NightOwl888

1 Answers

0
votes

I found a solution to this problem with the help of this blog post: https://weblog.west-wind.com/posts/2017/Jun/22/MultiTargeting-and-Porting-a-NET-Library-to-NET-Core-20

The post talks you through the process of porting a .Net Library to a .Net Standard library that targets multiple runtime versions. This turns out to be exactly what I needed to do.

I took my service that I had written in .Net framework 4.5.1 and copied the files to a new .Net Standard library I created. I then changed the target frameworks to support multiple runtime versions manually (you can't do this using the Visual Studio UI at time of writing). For my purposes I used the following to support .Net Core 2, .Net Standard and .Net 4.7.0:

<PropertyGroup>
    <TargetFrameworks>netcoreapp2.0;netstandard2.0;net47</TargetFrameworks>
  </PropertyGroup>

The framework you write first is the one that is targeted but I found that Visual Studio gave me errors for methods that weren't available in all versions of the Azure Storage library so I was able to write a service which worked on all three without writing any runtime-specific code.