The reference assemblies for framework “.NETFramework,Version=v4.5.1” were not found in RHPL

Viewed 6899

we have install dotnet sdk in our RHPL version 7. when we try to build our project we getting some build error. my dotnet version on Linux is 1.0.4. we are getting error like this

    error MSB3644: The reference assemblies for framework ".NETFramework,Version=v4.5.1" were not found. To resolve this, install the SDK or Targeting Pack for this framework version or retarget your application to a version of the framework for which you have the SDK or Targeting Pack installed.
Note that assemblies will be resolved from the Global Assembly Cache (GAC) and will be used in place of reference assemblies. Therefore your assembly may not be correctly targeted for the framework you intend. 
2 Answers

To target .NET framework (as opposed to standard/core), you will need to have at least part of Mono installed. The simplest would be to simply install all of mono (version 5 or higher recommended) and use its msbuild instead of dotnet build.

At some point, the dotnet SDK should be able to find and use the Mono reference assemblies automatically (cfr. https://github.com/dotnet/sdk/issues/335); then you would only need those, not the full Mono environment.

As it stands, if you have the Mono reference assemblies installed (likely in a location like /usr/lib/mono/4.5.1-api), you should be able to do something like dotnet build /p:FrameworkPathOverride=/usr/lib/mono/4.5.1-api. If you're multi-targeting, you could set up a <PropertyGroup> in your project to set FrameworkPathOverride appropriately.

For example:

<PropertyGroup Condition="'$(MonoReferenceAssemblies)' != ''">
  <FrameworkPathOverride Condition="'$(TargetFramework)' == 'net20'">
    $(MonoReferenceAssemblies)/2.0-api
  </FrameworkPathOverride>
  <FrameworkPathOverride Condition="'$(TargetFramework)' == 'net35'">
    $(MonoReferenceAssemblies)/3.5-api
  </FrameworkPathOverride>
  <FrameworkPathOverride Condition="'$(TargetFramework)' == 'net40'">
    $(MonoReferenceAssemblies)/4.0-api
  </FrameworkPathOverride>
  <FrameworkPathOverride Condition="'$(TargetFramework)' == 'net45'">
    $(MonoReferenceAssemblies)/4.5-api
  </FrameworkPathOverride>
  <FrameworkPathOverride Condition="'$(TargetFramework)' == 'net451'">
    $(MonoReferenceAssemblies)/4.5.1-api
  </FrameworkPathOverride>
  <FrameworkPathOverride Condition="'$(TargetFramework)' == 'net452'">
    $(MonoReferenceAssemblies)/4.5.2-api
  </FrameworkPathOverride>
  <FrameworkPathOverride Condition="'$(TargetFramework)' == 'net46'">
    $(MonoReferenceAssemblies)/4.6-api
  </FrameworkPathOverride>
  <FrameworkPathOverride Condition="'$(TargetFramework)' == 'net461'">
    $(MonoReferenceAssemblies)/4.6.1-api
  </FrameworkPathOverride>
  <FrameworkPathOverride Condition="'$(TargetFramework)' == 'net462'">
    $(MonoReferenceAssemblies)/4.6.2-api
  </FrameworkPathOverride>
  <FrameworkPathOverride Condition="'$(TargetFramework)' == 'net47'">
    $(MonoReferenceAssemblies)/4.7-api
  </FrameworkPathOverride>
  <FrameworkPathOverride Condition="'$(TargetFramework)' == 'net471'">
    $(MonoReferenceAssemblies)/4.7.1-api
  </FrameworkPathOverride>
</PropertyGroup>

That way, dotnet build /p:MonoReferenceAssemblies=/usr/lib/mono would work regardless of target framework version (as long as the relevant reference assemblies are installed).

Related