NuGet パッケージからプロジェクト出力ディレクトリにネイティブ ファイルを追加する 質問する

NuGet パッケージからプロジェクト出力ディレクトリにネイティブ ファイルを追加する 質問する

ネイティブ win32 dll に pinvoke する .Net アセンブリの NuGet パッケージを作成しようとしています。アセンブリとネイティブ dll の両方を、プロジェクト参照に追加されたアセンブリとともにパックする必要があります (この部分では問題ありません)。ネイティブ dll は、プロジェクト出力ディレクトリまたはその他の相対ディレクトリにコピーする必要があります。

私の質問は次のとおりです:

  1. Visual Studio が参照リストに追加しないようにネイティブ DLL をパックするにはどうすればよいですか?
  2. ネイティブ dll をコピーするには install.ps1 を作成する必要がありますか? その場合、コピーするためにパッケージ コンテンツにアクセスするにはどうすればよいでしょうか?

ベストアンサー1

ターゲット ファイル内のターゲットを使用してCopy必要なライブラリをコピーしても、そのプロジェクトを参照する他のプロジェクトにそれらのファイルはコピーされず、 になります。ただし、MSBuild は参照プロジェクトにすべてのファイルをコピーするため、要素DllNotFoundExceptionを使用して、はるかに単純なターゲット ファイルでこれを行うことができます。NoneNone

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <NativeLibs Include="$(MSBuildThisFileDirectory)**\*.dll" />
    <None Include="@(NativeLibs)">
      <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>
</Project>

build必要なネイティブ ライブラリとともに、ターゲット ファイルを NuGet パッケージのディレクトリに追加します。ターゲット ファイルには、ディレクトリdllのすべての子ディレクトリ内のすべてのファイルが含まれます。したがって、マネージ アセンブリで使用されるネイティブ ライブラリのバージョンをbuild追加すると、次のようなディレクトリ構造になります。x86x64Any CPU

  • 建てる
    • 86 の
      • ネイティブライブラリ.dll
      • NativeLibDependency.dll
    • 64ビット
      • ネイティブライブラリ.dll
      • NativeLibDependency.dll
    • MyNugetPackageID.ターゲット
  • ライブラリ
    • ネット40
      • マネージドアセンブリ.dll

ビルド時に、プロジェクトの出力ディレクトリに同じx86およびx64ディレクトリが作成されます。サブディレクトリが必要ない場合は、 および**%(RecursiveDir)削除し、代わりに必要なファイルをbuildディレクトリに直接含めることができます。他の必要なコンテンツ ファイルも同様の方法で追加できます。

ターゲットファイルに追加されたファイルは、NoneVisual Studioで開いたときにプロジェクトに表示されません。nupkgのフォルダーを使用しないのは、要素をContent設定する方法がないためです。CopyToOutputDirectoryPowerShellスクリプトを使用せずに(これはVisual Studio内でのみ実行され、コマンドプロンプト、ビルドサーバー、または他のIDEでは実行されません。project.json / xproj DNX プロジェクトではサポートされていませんLink) であり、プロジェクト内にファイルの追加コピーを持つよりも、ファイルに を使用することを好みます。

アップデート:これは でも動作するはずですがContentNonemsbuild にバグがあるため、ファイルは 1 ステップ以上削除された参照プロジェクトにコピーされません (例: proj1 -> proj2 -> proj3、proj3 は proj1 の NuGet パッケージからファイルを取得しませんが、proj2 は取得します)。

おすすめ記事