[英]Targets file for deploying nativs dlls to output directory
我有一个具有以下结构的 nuget:
Lib
-> net45
-> MyDll.dll
Runtimes
-> win10-x64
-> native
dependency1.dll
dependency2.dll
dependency3.dll
我将此 nuget 添加到我的一个项目中。 每当我构建该项目时,我都希望将所有 dll 复制到输出目录中。 但是,只有“MyDll.dll”会被复制,而本机 Runtimes 文件夹中的所有 dll 不会被复制。 我看过这篇文章,它解释了如何使用 .targets 文件来完成此操作: Add native files from NuGet package to project output directory 。 但是,我找不到有关如何添加 .targets 文件的具体信息,这篇文章已有 6 年历史。 现在肯定存在一些新的/更好的东西吗?
基本上,将本机 dll 复制到构建的输出目录的最佳方法是什么?
这实际上取决于您的客户项目是本地项目还是托管项目。
如果你的项目是原生项目,你需要做的是:
<?xml version="1.0"?>
<package >
<metadata>
<id>YourPackage</id>
<version>1.0.0.0</version>
<title>Your Packaged Software</title>
<authors>your name</authors>
<owners>your name</owners>
<iconUrl>link to icon</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Description for your package</description>
<releaseNotes>Fixed that, added this</releaseNotes>
<copyright>Copyright by you</copyright>
<tags>native yourpackage library</tags>
</metadata>
<files>
<!-- .targets file that should be included in the dependee project automatically by Nuget -->
<file src="YourPackage.targets" target="\build\native\YourPackage.targets" />
<!-- Include header files for development -->
<file src="include\**" target="\lib\native\include" />
<!-- Binaries -->
<file src="bin\**" target="\lib\native\bin" />
</files>
</package>
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
<ItemDefinitionGroup>
<!-- COMPILATION -->
<!-- header files (.h) that should be copied -->
<ClCompile>
<AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)..\..\lib\native\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<!-- This is just for the convinience, so you can check within C++ code if the package is used, i.e.: #ifdef HAS_YOUR_PACKAGE -->
<PreprocessorDefinitions>HAS_YOUR_PACKAGE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
</ItemDefinitionGroup>
<!-- LINKING -->
<!-- Add static/import library for linking -->
<ItemDefinitionGroup>
<Link>
<AdditionalLibraryDirectories>$(MSBuildThisFileDirectory)..\..\lib\native\bin\$(Platform)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>yourlibrary.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<!-- DEPLOYMENT -->
<!-- Copy dlls to $(OutDir) -->
<ItemGroup>
<NativeLibs Include="$(MSBuildThisFileDirectory)..\..\lib\native\bin\$(Platform)\*.dll" />
<None Include="@(NativeLibs)">
<Link>%(FileName)%(Extension)</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
nuget pack YourPackage.nuspec
这将创建一个新的 nuget 包,在本机项目中使用该包时应该可以工作。更新重要说明:在 .targets 文件的最后一部分,您必须命名保存要复制到输出文件夹的文件名的变量。 不要将此变量的通用名称命名为“NativeLibs”,因为如果您将拥有 1 个以上的本机 nuget 包,则 VS 在加载使用该包的项目时会发生冲突。
为避免名称冲突,请为其指定一个唯一名称。 像 YourPackageNativeLibs 这样的东西会起作用。 所以最后一部分看起来像:
<!-- DEPLOYMENT -->
<!-- Copy dlls to $(OutDir) -->
<ItemGroup>
<YourPackageNativeLibs Include="$(MSBuildThisFileDirectory)..\..\lib\native\bin\$(Platform)\*.dll" />
<None Include="@(YourPackageNativeLibs)">
<Link>%(FileName)%(Extension)</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.