如何设置 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,始终始终设置 &lt;OutDir&gt; 属性。这决定了编译后的二进制文件的位置。这看起来像:

<OutDir>bla bla bla\bin\$(Configuration)\</OutDir>

注意它也必须以反斜杠结尾。

对于托管 DLL,始终始终设置 &lt;OutputPath&gt; 属性。这决定了编译托管程序集的位置。这看起来像:

<OutputPath>bla bla bla\bin\$(Configuration)\</OutputPath>

注意到他们都去了同一个地方吗?

【讨论】:

@C Johnson - 使用 $(MSBuildProjectDirectory)\bin\$(Configuration)\ 有效。非常感谢。 另一个注意事项:为了保持干净,我总是喜欢定义 *.obj 文件和其他中间垃圾的去向。也定义属性&lt;IntDir&gt;。并将其指向某个不碍事的地方。【参考方案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 文件夹中?的主要内容,如果未能解决你的问题,请参考以下文章

Mysql报Too many connections,不要乱用ulimit了,看看如何正确修改进程的最大文件数

MySQL 字符编码设置

如何设置 nginx 最大打开文件数?

如何设置 GetOpt 的默认值?

my97datepicker日期控件的宽度高度如何设置呢?

如何在文本区域的末尾设置光标?