用于将nativs dll部署到输出目录的目标文件

问题描述 投票:0回答:1

我有一个具有以下结构的小部件:

Lib
  -> net45
    -> MyDll.dll
Runtimes
  -> win10-x64
    -> native
      dependency1.dll
      dependency2.dll
      dependency3.dll

我将此nuget添加到我的一个项目中。每当我构建该项目时,我都希望将所有dll复制到输出目录中。但是,只会复制“ MyDll.dll”,而不会复制本机“运行时”文件夹中的所有dll。我看过这篇文章,解释了如何使用.targets文件来完成此操作:Add native files from NuGet package to project output directory。但是,我找不到有关如何添加.targets文件的具体信息,并且该文章已有6年的历史。现在肯定有新的更好的东西吗?

基本上,将本机dll复制到构建的输出目录的最佳方法是什么?

c# dll build msbuild nuget
1个回答
0
投票
这实际上取决于您的客户项目是本地项目还是托管项目。

如果您的项目是本机项目,则需要执行以下操作:

0)假设我们具有以下结构:

    bin
    • Win32
      • yourlibrary.lib
    • yourlibrary.dll
  • x64
    • yourlibrary.lib
  • yourlibrary.dll
  • 包括
    • yourlib.h
  • YourPackage.nuspec
  • YourPackage.targets
  • 1)YourPackage.nuspec文件包含以下内容:

    <?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>

    2)然后添加.target文件:

    <?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>

    3)完成所有操作后,在程序包目录中运行:nuget pack YourPackage.nuspec这将创建一个新的nuget程序包,该程序包在本机项目中使用后应该可以工作。

    重要提示:这对我有用,但是有时在VS中加载客户端项目失败。

  • © www.soinside.com 2019 - 2024. All rights reserved.