以下をプロジェクト ファイルに追加するだけです:
<ItemGroup Condition="$(TargetFramework.StartsWith('net4')) AND '$(MSBuildRuntimeType)' == 'Core' AND '$(OS)' != 'Windows_NT'">
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.0" PrivateAssets="All" />
</ItemGroup>
これにより、Windows 以外のシステムで .NET Framework のビルドとパックが可能になります。ただし、dotnet
を使用して .NET Core ターゲットのみを実行できます。 Windows 以外のシステムでの CLI。したがって、次のように、Windows 以外のシステムで実行するターゲット フレームワークを選択する準備もできている必要があります。
dotnet run -f netcoreapp2.1
解決策のソース:https://github.com/dotnet/designs/pull/33#issuecomment-489264196.これは回避策であるため、将来変更される可能性があります。
.NET CLI の配布には .NET Framework の参照アセンブリが含まれていないため、そのバージョンの MSBuild は必要なコンパイル時のアセットを解決できません。ただし、このシナリオは GitHub で追跡されており、MSBuild への移行前に機能していました (CLI は mono の参照アセンブリを使用できます)。
ただし、Windows 以外のマシンでライブラリを構築するために使用できるいくつかの代替手段があります:
<強い>1.ライブラリの構築には mono 5+ を使用してください。
これはおそらく最も安定したパスです。
Mono 5 以降には、.NET Standard および .NET Core アプリケーションをビルドするために必要なビルド ロジックが含まれています。 Linux では、mono の msbuild を別のパッケージとしてインストールする必要がある場合があります。したがって、次の一般的に使用されるコマンドの代わりに
dotnet restore
dotnet build
dotnet publish -c Release
次のことを行うには、mono の msbuild を使用します:
msbuild /t:Restore
msbuild
msbuild /t:Publish /p:Configuration=Release
mono <5.2 のパックの回避策:
唯一の制限は、mono (<5.2) はそのままでは NuGet パッケージを生成できないことですが、NuGet.Build.Tasks.Pack
を使用する回避策があります。 msbuild /t:Pack /p:Configuration=Release
を実行できるプロジェクトの NuGet パッケージ プロジェクト ファイルを次のように変更します (特に、削除された Sdk="..."
に注意してください)。 <Project>
の属性 要素):
<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. .NET CLI を使用して、モノの参照アセンブリを使用するように MSBuild に指示します。
net*
用にビルドする場合 ターゲット フレームワークでは、FrameworkPathOverride
を設定できます プロパティは、環境変数または csproj ファイルのプロパティの両方として使用できます。一連の参照アセンブリを指す必要があります。mono の参照アセンブリをここで使用できます。ただし、.NET CLI の MSBuild バージョンが追跡できない他のディレクトリへの参照を含む特別なファイル (再配布リスト) が含まれているものもあります。ただし、多くのシナリオで機能します:
export FrameworkPathOverride=/usr/lib/mono/4.5/
dotnet build -f net45
これは F# チームによって使用され、文書化されました。
<強い>3.参照アセンブリを含む NuGet パッケージを使用してください。
一部の MyGet フィードでは、Microsoft は参照アセンブリを含む NuGet パッケージを公開しています。ただし、公開されていないか「公式」ではないため、このプロセスはある時点で失敗する可能性があります。ただし、このパスを公式にすることを調査する予定です。
まず、ソリューションのディレクトリに NuGet.Config ファイルを作成し、次の内容でフィードを追加します。
<?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>
次に、項目グループを追加して PackageReference
を追加できます ターゲティング パックと PropertyGroup
次のように参照アセンブリへのパスを設定するには:
<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>
RuntimeIdentifier
を変更できます ネイティブ アセットを使用する場合は、さまざまなプラットフォーム用 (例:.so
を取得する場合) Linux 用のファイル) またはライブラリをビルドするときに完全に削除してください。