Moving .NET 4.8 to .NET 7 cause SqlClient PlatformNotSupportedException

Hi everyone!

I am working on moving our rhino plugins from .NET Framework 4.8 to .NET 7 as Rhino 8 switches to that. I have transformed edmx database file to EF Core format with EF Core Power Tools but when I try to use the DbContext I get below error:

System.PlatformNotSupportedException: 'Microsoft.Data.SqlClient is not supported on this platform.'

PackageReferences are listed below:

<ItemGroup>
  <PackageReference Include="Microsoft.Data.SqlClient" Version="5.1.5" />
  <PackageReference Include="Microsoft.Data.SqlClient.SNI.runtime" Version="5.1.1" />
  <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.15" />
  <PackageReference Include="Microsoft.EntityFrameworkCore.Abstractions" Version="7.0.15" />
  <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.15">
    <PrivateAssets>all</PrivateAssets>
    <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
  </PackageReference>
  <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.15" />
  <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.15" />
  <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.Design" Version="1.1.6" />
  <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.15">
    <PrivateAssets>all</PrivateAssets>
    <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
  </PackageReference>
  <PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
  <PackageReference Include="Microsoft.SqlServer.Server" Version="1.0.0" />
  <PackageReference Include="PreEmptive.Protection.Checks.Attributes" Version="2.0.0" />
  <PackageReference Include="System.Data.Common" Version="4.3.0" />
  <PackageReference Include="System.Data.SqlClient" Version="4.8.6" />
  <PackageReference Include="System.Interactive.Async" Version="6.0.1" />
  <PackageReference Include="System.Memory" Version="4.5.5" />
  <PackageReference Include="System.Reflection.Emit" Version="4.7.0" />
  <PackageReference Include="System.Reflection.TypeExtensions" Version="4.7.0" />
  <PackageReference Include="System.Runtime.Handles" Version="4.3.0" />
  <PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="8.0.0" />
  <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
  <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="8.0.0" />
  <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0" />
  <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
  <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.0" />
  <PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
  <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.0" />
  <PackageReference Include="Microsoft.Extensions.Options" Version="8.0.1" />
  <PackageReference Include="Microsoft.Extensions.Primitives" Version="8.0.0" />
  <PackageReference Include="Microsoft.NETCore.Platforms" Version="7.0.4" />
  <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
  <PackageReference Include="System.Collections.Immutable" Version="8.0.0" />
  <PackageReference Include="System.ComponentModel.Composition" Version="8.0.0" />
  <PackageReference Include="System.Configuration.ConfigurationManager" Version="8.0.0" />
  <PackageReference Include="System.Data.OleDb" Version="8.0.0" />
  <PackageReference Include="System.Diagnostics.DiagnosticSource" Version="8.0.0" />
  <PackageReference Include="System.Management" Version="8.0.0" />
  <PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.0.0" />
  <PackageReference Include="System.Security.Cryptography.Cng" Version="5.0.0" />
  <PackageReference Include="System.Security.Cryptography.Pkcs" Version="8.0.0" />
  <PackageReference Include="System.Security.Cryptography.Xml" Version="7.0.1" />
</ItemGroup>

Has anyone faced this issue? I have also created an issue at github repository of SqlClient but it may be related to plugin structure so I wanted to ask about it here as well. Thanks a lot! hi @dale, do you have any suggestions?

I have tried to downgrade dependencies but it didn’t work.

I’ve also tried to specify runtime in csproj file like below but they did not work either.

<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<RuntimeIdentifier>win</RuntimeIdentifier>
  <ItemGroup>
    <None Include="$(USERPROFILE)\.nuget\packages\microsoft.data.sqlclient\5.1.5\runtimes\win\lib\net6.0\Microsoft.Data.SqlClient.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>
  <Target Name="CopyToBin" BeforeTargets="Build">
    <Copy SourceFiles="$(USERPROFILE)\.nuget\packages\microsoft.data.sqlclient\5.1.5\runtimes\win\lib\net6.0\Microsoft.Data.SqlClient.dll" DestinationFolder="$(OutputPath)\bin" />
  </Target>

I have also cleared the nuget cache but it didn’t help. I guess I am in problem with package versions but not sure which versions to use. All of them seems to be the latest versions.

Hi @tahirhan,

Any success with the preview version?

– Dale

Unfortunately @dale, it didn’t help. I have also removed System.Data.SqlClient dependency to prevent possible confusion but it didn’t fix the issue either.

Hi @dale, I have created a new plugin from scratch with RhinoCommon R8 dll and .NET 7 and I am just trying to connect to database with just required dependencies but I still get same error. Is it something related to Rhino 8’s configuration? Creating a console application and connecting to db works but creating a blank rhino plugin and trying to connect to a sql server on cloud via entityframework doesn’t work.

Does this console application target .NET 7?

– Dale

Yes, console application created for test is targeting .NET 7 and it only added below dependency:

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.15" />
  </ItemGroup>

@curtisw - is this something you can help with?

Hey @tahirhan,

I think this will require us to implement RH-80178 which will also allow us to use the .NET Core resolver to load managed and native dependencies for plugins correctly from their runtimes\ folder.

What is likely going on is the incorrect assembly is being loaded is the “generic one”, but it really needs to load the one from runtimes\win\lib\* instead.

I believe if you load the appropriate assemblies manually by path in your plugin (before any code that uses it is called) it may get it to work, but this is obviously not a great solution going forward. You should be able to look at the debugger output to see what System.Data.SqlClient assembly is actually being loaded to troubleshoot this.

Sorry I couldn’t offer a better solution for now.

Hi @curtisw ,

Thank you for the clarification. I am waiting for the update about the runtime fix. Is there any possible release date for that?

Loading assemblies from a path may cause problems on client computers so I guess this would be not a good solution for us at the moment.

Hey @tahirhan, I’m hoping to get to that very soon, so likely Rhino 8.6 or if not 8.7.

Cheers,
Curtis.

Hi @curtisw, again thanks for the clarification!

Hi @curtisw, Any update on this?