David Thielen
David Thielen

Reputation: 32926

Is there a way to have .NET Framework code in a .NET Core library?

We have a commercial library that I am working to port to .NET Core. There are a couple of calls in it I want to retain to use only if running in .NET standard. (For the curious, one set is to read a file on a Windows server that requires credentials to access.)

Is there:

  1. A call that will tell me if I am running under .NET Standard vs. .NET Core.
  2. Is there a way to have a class that is only going to be instantiated/called if running under standard, but the DLL will still load fine under Core?

Also asked on MSDN

Upvotes: 2

Views: 106

Answers (2)

.NET Standard is not a runtime, it is a set of APIs that a runtime must implement in order to be compatible. So basically this allows people to have a library target .NET Standard and have one code-base that will run in all supported runtimes because it is guaranteed that those runtimes will have an implementation for those APIs.

.NET Standard doesn't have implementation at all, it just defines a set contract of APIs which is used at compile time, but at runtime the APIs used will be the ones in the runtime the consumer decided to target their application for.

A better runtime detection would be to use RuntimeInformation.FrameworkDescriptor APIs. We do that for our framework tests to know what we're running our tests on: https://github.com/dotnet/runtime/blob/master/src/libraries/Common/tests/CoreFx.Private.TestUtilities/System/PlatformDetection.cs#L21

You could also achieve this via reflection by doing something like: typeof(string).Assembly... if the assembly is System.Private.CoreLib you're on .NET Core, if it is mscorlib, you're in .NET Framework.

Upvotes: 1

nvoigt
nvoigt

Reputation: 77304

Since what you describe, having a single nuget package and being able to specify different behaviours or dependencies depending on the framework the nuget package is installed into, can only be reached through Multi Targeting I will assume you are doing that or will be doing it.

Once you have specified target frameworks, you have pre-defined variables to use in precompile blocks:

#if NETFRAMEWORK
    // use full framework class here. You were installed into a full framework app or library
#elif NETCOREAPP
    // use .NET Core class here. You were installed into a .NET Core app or library
#else NETSTANDARD
    // uh... okay... you were installed into another .NET Standard library, 
    // we still have no idea where *that* might be installed... help? 
    // Maybe make it configurable after all?
#endif

Upvotes: 3

Related Questions