83

C# プロジェクトから使用するとうまく動作する NuGet パッケージを作成しました。lib/net40ディレクトリにDLL が含まれており、DLL が参照として追加されます。

NuGet が C++ をサポートするようになったので、実際にパッケージを変更して、C++/CLI プロジェクトで DLL をマネージ参照として追加できるようにするにはどうすればよいでしょうか? これを説明するチュートリアルが見つかりません。パッケージをそのまま追加しようとすると、次のエラーが発生します。

このパッケージを 'Native,Version=v0.0' を対象とするプロジェクトにインストールしようとしていますが、パッケージにはそのフレームワークと互換性のあるアセンブリ参照またはコンテンツ ファイルが含まれていません。

解決策はファイルを lib/native の下に置くことだと思うかもしれませんが、 http://docs.nuget.org/docs/reference/support-for-native-projectsによると、それはサポートされていません。また、DLL を lib の直下に置くだけでは何も起こらないようです。

どうやら、build/native の下にある.propsor.targetsファイルを使用してこれを行うことになっているようですが、これを機能させるにはこれらのファイルに何を入れる必要がありますか?

4

8 に答える 8

34

Patrick O'Hara が書いたように、NuGet は C++/CLI プロジェクトを変更しません。GitHub の問題 NuGet/Home#1121 - 管理パッケージを CLI プロジェクトにインストールできないを参照してください。ただし、NuGet コマンド ライン ユーティリティを使用すると、NuGet.exeNuGet をダウンロードして目的のパッケージを解凍できます。

完全な例として、 Visual Studio 2013 C++/CLI プロジェクトでOptimizedPriorityQueue 1.0.0への参照を追加するために実行した手順を次に示します。

  1. まだ開いていない場合は、パッケージ マネージャー コンソールを開きます ( [ツール] > [NuGet パッケージ マネージャー] > [パッケージ マネージャー コンソール] )。
  2. パッケージ マネージャー コンソールで、NuGet.CommandLine パッケージをインストールします。

    インストール パッケージ NuGet.CommandLine
    

    (注: この記事の執筆時点では、NuGet.CommandLine の最新バージョンは 2.8.6 です。ユーザーによっては異なる場合があります。)

  3. プロジェクト フォルダー内に.nuget\packages.config、次の内容の XML ファイルが作成されます。

    <?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="NuGet.CommandLine" version="2.8.6" />
    </packages>
    
  4. Notepad++ などのテキスト エディター<package>で、目的のパッケージの要素を追加します。この場合、次のように追加しました。

    <package id="OptimizedPriorityQueue" version="1.0.0" />
    

    ..<packages>要素内。

  5. コマンド プロンプトを開きます (VS2013 開発者コマンド プロンプトを開きましたが、通常のコマンド プロンプトで動作するはずです)。

  6. cdプロジェクトフォルダーに。
  7. 次のコマンドを実行し、NuGet.CommandLine のバージョン番号が異なる場合は変更します。

    .\packages\NuGet.CommandLine.2.8.6\tools\NuGet.exe インストール -NonInteractive -OutputDirectory パッケージ .nuget\packages.config
    

    私にとって、出力は次のとおりです。

    「OptimizedPriorityQueue 1.0.0.0」をインストールしています。
    「OptimizedPriorityQueue 1.0.0.0」が正常にインストールされました。
    packages.config にリストされているすべてのパッケージは、既にインストールされています。
    
  8. Visual Studio でプロジェクトを右クリックし、 [プロパティ] を選択します。Common Properties > Referencesの下で、Add New Reference…ボタンをクリックします。
  9. 左側の[参照]を選択します。[参照の追加] ダイアログの [OK] ボタンと [キャンセル] ボタンの隣に、[参照… ] ボタンがあります。それをクリックして、ファイル選択ダイアログを開きます。
  10. NuGet がpackagesプロジェクト フォルダーのサブディレクトリに解凍した DLL に移動し、[追加] ボタンをクリックします。[ OK ] をクリックして、[参照の追加] ダイアログを閉じます。
  11. これで、C++/CLI プロジェクトでアセンブリを使用できるようになります。

    using namespace Priority_Queue;
    
    //...
    
于 2015-11-03T17:11:45.170 に答える
7

実際には、「通常の」NuGet パッケージをインストールして、次の手順を使用して C++/CLI プロジェクトから自動的に参照できるようにする可能性があるようです (少なくとも を使用NuGet >= 2.5)。

  1. パッケージ化するプロジェクトにファイルを追加 (または変更) し、build\<ProjectName>.targets次の内容を入れます (必ず<AssemblyName>実際の値に置き換えてください)。

    <?xml version="1.0" encoding="utf-8" ?>
    <Project ToolsVersion="4.0"
             xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <!-- for C++/CLI projects only -->
      <ItemGroup Condition="'$(Language)' == 'C++'">
        <Reference Include="<AssemblyName>">
          <!--
            this .targets file is installed next to the assembly,
            so we do not have to figure out any versions or paths here ourselves
          -->
          <HintPath>
            $(MSBuildThisFileDirectory)..\lib\native\<AssemblyName>.dll
          </HintPath>
        </Reference>
      </ItemGroup>
    </Project>
    
  2. パッケージ化されたプロジェクトの.nuspecで、1 つ以上のエントリを追加して、ターゲット マシンのディレクトリにfileもアセンブリを配置します。lib\native\

    <package>
      <metadata>
        ...
      </metadata>
      <files>
        ...
        <!--
          add a copy of the assembly to lib\native to prevent NuGet
          from complaining about incompatible native projects
        -->
        <file src="bin\$configuration$\$id$.dll" target="lib\native\" />
        <file src="bin\$configuration$\$id$.xml" target="lib\native\" />
    
        <!-- don't forget about the .targets file containing the reference -->
        <file src="build\$id$.targets" target="build\" />
      </files>
      ...
    </package>
    

NuGet がアセンブリ参照を C++/CLI プロジェクトに追加しない場合でも、パッケージによって提供されるすべてのファイル.propsとファイルが挿入されます。.targets手順 1 のカスタム ターゲットは、パッケージ化されたアセンブリへの参照を追加します。

私が見る限り、このソリューションの欠点の1 つは、このように追加された参照Commpon Properties/Framework and Referencesが C++/CLI プロジェクトのセクションに表示されないことです。他にもあるかもしれませんので、自己責任で…

于 2016-01-28T17:39:26.130 に答える
6

このポートへの回答で述べたように ( Nuget は Entity Framework を C++/CLI プロジェクトにインストールしません)、NuGet は C++/CLI プロジェクトに変更を加えません。ただし、依存関係をダウンロードして展開します。これは、make の依存関係の一部としてコマンド ラインから使用します。コマンドラインは次のようになります。

/.NuGet/NuGet.exe
      Install 
      -NonInteractive 
      -ConfigFile $ENV{SRC_ROOT}/.nuget/NuGet.config 
      -OutputDirectory $ENV{SRC_ROOT}/packages 
      $ENV{SRC_ROOT}/packages.config

コマンド ラインの引数は、読みやすくするために 1 行ずつに分けられていることに注意してください。また、NuGet を .NuGet フォルダーのソース管理にチェックインすることにしました。目標は、さまざまな環境 (すべてが Visual Studio を使用しているわけではありません) 向けにビルド マシンをセットアップしやすくすることでした。このコマンドを初めて実行したら、手動で依存関係を C++/CLI プロジェクトに追加する必要があります。
それが役立つことを願っています。

于 2014-10-21T13:47:57.660 に答える
1

インストーラーは、C# スタートアップ プロジェクトに自分自身への参照を追加しようとします。インストールする前に、C# プロジェクトをソリューションのスタートアップ プロジェクトにします。ダミーの C# プロジェクトがない場合は作成します

于 2016-11-22T12:50:26.190 に答える