“.NETFramework,Version=v4.5.1”框架的参考程序集在RHPL中未找到。

3

我们在 RHPL 版本 7 上安装了 dotnet sdk。当我们尝试构建项目时,出现了一些构建错误。我的 Linux 上的 dotnet 版本是 1.0.4。我们遇到了如下错误:

    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. 

你的项目是否针对的是 .Net Framework 4.5.1 而不是 .Net Core? - DavidG
2个回答

4
您的项目目标是 .net 4.5.1,在 csproj 文件中应该有类似以下内容的代码: net451 这一行代码将会针对仅适用于 Windows 桌面的 .net 版本,无法在 Linux 上编译。您需要将项目目标设置为 netstandard 或者 netcoreapp,具体取决于您的使用情况。
如果您的项目中有一个 TargetFrameworks 属性(注意结尾的 s),并且它是由分号分隔的多个框架组成的列表,则很可能是多目标的。您可以调用 dotnet build /p:TargetFramework= 命令,其中 Framework 是列表中以 netstandard 或 netcoreapp 开头的框架之一。
请注意,您无法在 Linux 上编译 netX 代码,只能使用 netstandard、netcoreapp 和其他一些不太常见的名称。

0

为了针对.NET框架(而不是标准/核心),您需要安装至少部分Mono。

最简单的方法是直接安装所有的Mono(建议使用版本5或更高版本),并使用其msbuild而不是dotnet build。

在某些时候,dotnet SDK应该能够自动找到并使用Mono参考程序集(参见https://github.com/dotnet/sdk/issues/335);然后您只需要这些,而不是完整的Mono环境。

目前,如果您已经安装了Mono参考程序集(可能位于类似/usr/lib/mono/4.5.1-api的位置),则您应该能够执行类似于dotnet build /p:FrameworkPathOverride=/usr/lib/mono/4.5.1-api的操作。

如果您正在进行多目标设置,则可以在项目中设置一个<PropertyGroup>来适当地设置FrameworkPathOverride

例如:

<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>

这样,dotnet build /p:MonoReferenceAssemblies=/usr/lib/mono将适用于任何目标框架版本(只要相关的参考程序集已安装)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接