Sie können Ihrer Projektdatei einfach Folgendes hinzufügen:
<ItemGroup Condition="$(TargetFramework.StartsWith('net4')) AND '$(MSBuildRuntimeType)' == 'Core' AND '$(OS)' != 'Windows_NT'">
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.0" PrivateAssets="All" />
</ItemGroup>
Dies ermöglicht das Erstellen und Packen auf Nicht-Windows-Systemen für .NET Framework. Sie können jedoch nur .NET Core-Ziele mit dotnet
ausführen CLI auf Nicht-Windows-Systemen. Sie sollten also auch bereit sein, ein Ziel-Framework auszuwählen, das auf Nicht-Windows-Systemen ausgeführt werden soll, wie hier:
dotnet run -f netcoreapp2.1
Quelle der Lösung:https://github.com/dotnet/designs/pull/33#issuecomment-489264196. Dies ist eine Problemumgehung und kann daher in Zukunft geändert werden.
Die Verteilung der .NET-CLI enthält keine Referenzassemblys für .NET Framework, sodass ihre Version von MSBuild die erforderlichen Ressourcen zur Kompilierzeit nicht auflösen kann. Dieses Szenario wird jedoch auf GitHub nachverfolgt und hat vor der Migration zu MSBuild funktioniert (die CLI könnte die Referenzassemblys von Mono verwenden).
Es gibt jedoch einige Alternativen, die verwendet werden können, um Ihre Bibliothek auf Nicht-Windows-Rechnern zu erstellen:
1. Verwenden Sie mono 5+, um die Bibliothek zu erstellen.
Dies ist wahrscheinlich der stabilste Pfad.
Mono 5 und höher enthält die erforderliche Buildlogik zum Erstellen von .NET Standard- und .NET Core-Anwendungen. Unter Linux muss msbuild von Mono möglicherweise als separates Paket installiert werden. Anstelle der folgenden häufig verwendeten Befehle
dotnet restore
dotnet build
dotnet publish -c Release
Sie würden msbuild von Mono verwenden, um Folgendes zu tun:
msbuild /t:Restore
msbuild
msbuild /t:Publish /p:Configuration=Release
Problemumgehung für Mono <5.2:
Die einzige Einschränkung besteht darin, dass Mono (<5.2) keine sofort einsatzbereiten NuGet-Pakete erstellen kann, aber es gibt eine Problemumgehung, bei der NuGet.Build.Tasks.Pack
verwendet wird NuGet-Paket im Projekt, mit dem Sie msbuild /t:Pack /p:Configuration=Release
ausführen können indem Sie die Projektdatei wie folgt ändern (beachten Sie insbesondere die entfernte Sdk="..."
Attribut auf <Project>
Element):
<Project>
<PropertyGroup>
<NuGetBuildTasksPackTargets>junk-value-to-avoid-conflicts</NuGetBuildTasksPackTargets>
</PropertyGroup>
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
<!-- All your project's other content here -->
<ItemGroup>
<PackageReference Include="NuGet.Build.Tasks.Pack" Version="4.0.0" PrivateAssets="All" />
</ItemGroup>
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
</Project>
2. Verwenden Sie die .NET-Befehlszeilenschnittstelle und weisen Sie MSBuild an, die Referenzassemblys von Mono zu verwenden.
Beim Bauen für net*
Zielframeworks können Sie den FrameworkPathOverride
setzen -Eigenschaft sowohl als Umgebungsvariable als auch als Eigenschaft in der csproj-Datei. Es muss auf einen Satz von Referenzassemblys verweisen – hier können die Referenzassemblys von Mono verwendet werden. Einige enthalten jedoch eine spezielle Datei (Redist-Liste), die Verweise auf andere Verzeichnisse enthält, denen die MSBuild-Version in der .NET-CLI nicht folgen kann. Es funktioniert jedoch in vielen Szenarien:
export FrameworkPathOverride=/usr/lib/mono/4.5/
dotnet build -f net45
Dies wurde vom F#-Team verwendet und dokumentiert.
3. Verwenden Sie ein NuGet-Paket, das Referenzassemblys enthält.
In einigen MyGet-Feeds veröffentlicht Microsoft NuGet-Pakete, die Referenzassemblys enthalten. Sie sind jedoch nicht veröffentlicht oder "offiziell", sodass dieser Prozess irgendwann fehlschlagen kann. Sie planen jedoch, diesen Weg offiziell zu untersuchen.
Erstellen Sie zuerst eine NuGet.Config-Datei im Verzeichnis Ihrer Lösung mit folgendem Inhalt, um den Feed hinzuzufügen:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="dotnet-core" value="https://dotnet.myget.org/F/dotnet-core/api/v3/index.json" />
</packageSources>
</configuration>
Dann können Sie eine Artikelgruppe hinzufügen, um den PackageReference
hinzuzufügen zu einem Targeting-Paket und einem PropertyGroup
um den Pfad zu den Referenzassemblys wie folgt festzulegen:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks>
</PropertyGroup>
<PropertyGroup Condition=" '$(TargetFramework)' == 'net461' ">
<RuntimeIdentifier>win7-x64</RuntimeIdentifier>
<FrameworkPathOverride>$(NuGetPackageFolders)microsoft.targetingpack.netframework.v4.6.1\1.0.1\lib\net461\</FrameworkPathOverride>
</PropertyGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
<PackageReference Include="Microsoft.TargetingPack.NETFramework.v4.6.1" Version="1.0.1" ExcludeAssets="All" PrivateAssets="All" />
</ItemGroup>
</Project>
Sie können den RuntimeIdentifier
ändern für verschiedene Plattformen, wenn Sie native Assets verwenden (z. B. um .so
zu erhalten Dateien für Linux) oder beim Erstellen von Bibliotheken vollständig entfernen.