2

.net 4.0 または 4.5 プロジェクトに追加できる NuGet パッケージを作成しようとしています。パッケージに含まれる実際のアセンブリは、.net 4.0 に対してビルドされたものを除いて、すべて .net 3.5 に対してビルドされます。これを制御できないため、アセンブリを「そのまま」使用する必要があります。

私が取り組んでいるプロジェクトは.net 4.5.2をターゲットにしており、これらの「レガシー」アセンブリを参照する必要があります。App.config に次のように記述して、「レガシー ランタイム アクティベーション」を有効にしました。

  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>
  </startup>

これはすべて十分に機能しているようです。ここで、「レガシー」アセンブリを NuGet パッケージにパッケージ化したいと考えています。私の .nuspec ファイルは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
    <metadata>
        <!-- many lines elided for clarity -->
        <references>
            <group>
                <reference file="NetFx35Assembly1.dll" />
                <reference file="NetFx35Assembly2.dll" />
            </group>
            <group targetFramework=".NETFramework4.5.2" >
                <reference file="NetFx40Assembly.dll" />
            </group>
         </references>
    </metadata>
    <files>
        <!-- .net 3.5 assemblies -->
        <file src="NetFx35Assembly1.dll" target="lib\net35\NetFx35Assembly1.dll" />
        <file src="NetFx35Assembly2.dll" target="lib\net35\NetFx35Assembly2.dll" />
        <!-- .net 4.0 assemblies -->        
        <file src="NetFx40Assembly.dll" target="lib\net40\NetFx40Assembly.dll" />
    </files>
</package>

このパッケージを .net 4.5.2 プロジェクトに追加すると、次のようになると予想していました。

  1. 3.5 アセンブリを参照します。これは、フレームワークが指定されていない「デフォルト」グループにあるためです。
  2. 4.5.2 をターゲットとするグループで指定されているため、4.0 アセンブリを参照します。

私が期待したように物事はうまくいきませんでした。私が実際に得たのは、4.0 アセンブリへの単一の参照でした。

必要な動作を作成する正しい方法は何ですか? <startup useLegacyV2RuntimeActivationPolicy="true">タグが App.config ファイルに存在することを NuGet パッケージで確認するにはどうすればよいですか?

4

1 に答える 1

1

参照のグループの場合、NuGet は 1 つのグループのみのすべての項目をインストールします。より具体的な一致がある場合、フレームワークが指定されていないグループはインストールされません。このデフォルト グループは、プロジェクトのターゲット フレームワークに一致するものが他にない場合に使用されます。

また、.NET 4.0 アセンブリが .NET 4.5.2 のみを対象としている場合を除き、NuGet パッケージで .NET 4.5.2 を明示的に対象としていない可能性があります。.NET 4.0 と互換性がある場合は、.NET 4.0 をターゲットにします。

        <group targetFramework="net35">
            <reference file="NetFx35Assembly1.dll" />
            <reference file="NetFx35Assembly2.dll" />
        </group>
        <group targetFramework="net40" >
            <reference file="NetFx35Assembly1.dll" />
            <reference file="NetFx35Assembly2.dll" />
            <reference file="NetFx40Assembly.dll" />
        </group>

上記は、メタデータ セクションで定義された参照を持たず、以下を使用することと同等であることに注意してください。

<files>
    <!-- .net 3.5 assemblies -->
    <file src="NetFx35Assembly1.dll" target="lib\net35" />
    <file src="NetFx35Assembly2.dll" target="lib\net35" />
    <!-- .net 4.0 assemblies -->        
    <file src="NetFx35Assembly1.dll" target="lib\net40" />
    <file src="NetFx35Assembly2.dll" target="lib\net40" />
    <file src="NetFx40Assembly.dll" target="lib\net40" />
</files>

app.config ファイルについては、XML ドキュメント変換を使用してスタートアップ要素を追加する方法を検討します。

于 2014-09-16T08:33:15.630 に答える