框架的引用程序集".NETFramework,Version=v4.5.1"在RHPL中找不到



我们在 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 4.5.1,在 csproj 中应该有如下所示的内容

<TargetFramework>net451</TargetFramework>

该行将针对基于Windows桌面的.net,该.net不会在Linux上编译。

您需要根据您的用例netstandardnetcoreapp项目目标。

如果你有一个TargetFrameworks属性(注意末尾的s(,有一个分号分隔的框架列表,那么它可能是多目标的。您可能会调用框架在框架列表中并且以netstandard或netcoreapp开头的dotnet build /p:TargetFramework=<FrameworkHere>

您将无法在 Linux 上编译 netX 代码,只能编译netstandardnetcoreapp和其他一些晦涩难懂的绰号。

要面向.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都可以工作。

最新更新