我正在学习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中?
答案 0 :(得分:2)
对于本机DLL,始终始终设置<OutDir>
属性。这确定了编译后的二进制文件的位置。看起来像这样:
<OutDir>bla bla bla\bin\$(Configuration)\</OutDir>
注意它也必须以反斜杠结尾。
对于托管DLL,始终始终设置<OutputPath>
属性。这确定了编译后的托管程序集的位置。看起来像这样:
<OutputPath>bla bla bla\bin\$(Configuration)\</OutputPath>
注意他们俩都去同一个地方吗?
答案 1 :(得分:1)
我有类似的问题。我通过使用“复制”功能解决了这一问题。参见下面的示例:
<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可用。