如何设置 My Package.targets 文件以将所有 dll 添加到 bin/debug 或 bin/Release 文件夹中?
Posted
技术标签:
【中文标题】如何设置 My Package.targets 文件以将所有 dll 添加到 bin/debug 或 bin/Release 文件夹中?【英文标题】:How to set up MyPackage.targets file to add all dll's into the bin/debug or bin/Release folder? 【发布时间】:2019-06-03 14:08:42 【问题描述】:我正在学习 NuGet。我确信这不是一项罕见的任务。我有一些本机 dll 需要添加到最终输出中。总共有25个dll,但只有7个可以直接添加为引用。
我目前有一个 NuGet 包,它使用以下结构直接添加 7 个引用:
build
x64
reference1.dll
...
reference7.dll
TheOthers1.dll
...
TheOthers20.dll
MyPackage.targets
lib
net472
reference1.dll
reference2.dll
reference3.dll
reference4.dll
reference5.dll
reference6.dll
reference7.dll
我的目标文件如下所示:
<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>
我的项目输出最终看起来像这样:
bin/Debug
Reference1.dll
...
Reference7.dll
x64
reference1.dll
...
reference7.dll
TheOthers1.dll
...
TheOthers20.dll
当我运行应用程序时,我得到:
System.IO.FileNotFoundException:'无法加载文件或程序集'reference1.dll'或其依赖项之一。找不到指定的模块。'
如果我将 x64 文件夹中的 dll 手动复制到应用程序运行的 bin/Debug 文件夹中。
如何构建 .targets 文件以将 build/x64 中的所有 dll 复制到 bin/Debug 或 bin/release 中?
【问题讨论】:
你有没有试过查看一个也有本机程序集的包,也许是 sqlite,看看他们是如何做到的? @zivkan - 哇...SQLite 发生了很多我不明白的事情。根据我有限的知识,SQLite.Interop.dll 就像我的 dll 一样被复制到 x64 文件夹中。当应用程序需要 SQLite.Interop.dll 而不是 bin/Debug 时,是否有什么东西可以告诉应用程序在 x64 文件夹中查找 SQLite.Interop.dll?就我而言,我的文件也在那里,但应用程序似乎找不到它们。 【参考方案1】:对于本机 DLL,始终始终设置 <OutDir>
属性。这决定了编译后的二进制文件的位置。这看起来像:
<OutDir>bla bla bla\bin\$(Configuration)\</OutDir>
注意它也必须以反斜杠结尾。
对于托管 DLL,始终始终设置 <OutputPath>
属性。这决定了编译托管程序集的位置。这看起来像:
<OutputPath>bla bla bla\bin\$(Configuration)\</OutputPath>
注意到他们都去了同一个地方吗?
【讨论】:
@C Johnson - 使用<IntDir>
。并将其指向某个不碍事的地方。【参考方案2】:
我有类似的问题。我通过使用“复制”功能解决了这个问题。请参阅下面的示例:
<Target Name="CopyREsources" AfterTargets="Build">
<Copy
SourceFiles="$(MSBuildThisFileDirectory)PDFtoPrinter.exe"
DestinationFiles="$(MSBuildProjectDirectory)\bin\$(Configuration)\PDFtoPrinter.exe"
Condition="!Exists('$(MSBuildProjectDirectory)\bin\$(Configuration)\PDFtoPrinter.exe')" />
</Target>
完整代码可在here获取。
【讨论】:
看起来它和 C Johnson 下面的回答一样有效。感谢您的贡献。以上是关于如何设置 My Package.targets 文件以将所有 dll 添加到 bin/debug 或 bin/Release 文件夹中?的主要内容,如果未能解决你的问题,请参考以下文章