ネイティブ win32 dll に pinvoke する .Net アセンブリの NuGet パッケージを作成しようとしています。アセンブリとネイティブ dll の両方を、プロジェクト参照に追加されたアセンブリとともにパックする必要があります (この部分では問題ありません)。ネイティブ dll は、プロジェクト出力ディレクトリまたはその他の相対ディレクトリにコピーする必要があります。
私の質問は次のとおりです:
- Visual Studio が参照リストに追加しないようにネイティブ DLL をパックするにはどうすればよいですか?
- ネイティブ dll をコピーするには install.ps1 を作成する必要がありますか? その場合、コピーするためにパッケージ コンテンツにアクセスするにはどうすればよいでしょうか?
ベストアンサー1
ターゲット ファイル内のターゲットを使用してCopy
必要なライブラリをコピーしても、そのプロジェクトを参照する他のプロジェクトにそれらのファイルはコピーされず、 になります。ただし、MSBuild は参照プロジェクトにすべてのファイルをコピーするため、要素DllNotFoundException
を使用して、はるかに単純なターゲット ファイルでこれを行うことができます。None
None
<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
追加すると、次のようなディレクトリ構造になります。x86
x64
Any CPU
- 建てる
- 86 の
- ネイティブライブラリ.dll
- NativeLibDependency.dll
- 64ビット
- ネイティブライブラリ.dll
- NativeLibDependency.dll
- MyNugetPackageID.ターゲット
- 86 の
- ライブラリ
- ネット40
- マネージドアセンブリ.dll
- ネット40
ビルド時に、プロジェクトの出力ディレクトリに同じx86
およびx64
ディレクトリが作成されます。サブディレクトリが必要ない場合は、 および**
を%(RecursiveDir)
削除し、代わりに必要なファイルをbuild
ディレクトリに直接含めることができます。他の必要なコンテンツ ファイルも同様の方法で追加できます。
ターゲットファイルに追加されたファイルは、None
Visual Studioで開いたときにプロジェクトに表示されません。nupkgのフォルダーを使用しないのは、要素をContent
設定する方法がないためです。CopyToOutputDirectory
PowerShellスクリプトを使用せずに(これはVisual Studio内でのみ実行され、コマンドプロンプト、ビルドサーバー、または他のIDEでは実行されません。project.json / xproj DNX プロジェクトではサポートされていませんLink
) であり、プロジェクト内にファイルの追加コピーを持つよりも、ファイルに を使用することを好みます。
アップデート:これは でも動作するはずですがContent
、None
msbuild にバグがあるため、ファイルは 1 ステップ以上削除された参照プロジェクトにコピーされません (例: proj1 -> proj2 -> proj3、proj3 は proj1 の NuGet パッケージからファイルを取得しませんが、proj2 は取得します)。