Answers:
在项目中使用生成后操作,然后添加命令以复制有问题的DLL。构建后操作将作为批处理脚本编写。
输出目录可以引用为$(OutDir)
。项目目录可从下载$(ProjDir)
。在适用的情况下,尝试使用相对路径,以便您可以复制或移动项目文件夹而不会破坏生成后操作。
$(OutDir)在VS2013中被证明是相对路径,因此我不得不将其与$(ProjectDir)结合使用以实现所需的效果:
xcopy /y /d "$(ProjectDir)External\*.dll" "$(ProjectDir)$(OutDir)"
顺便说一句,您可以通过在开头添加“ echo”来轻松调试脚本,并在构建输出窗口中观察展开的文本。
尝试将输出dll从一个C ++项目复制到同一解决方案中另一个C#项目的发布和调试文件夹时,上面的注释部分中的详细信息对我不起作用(VS 2013)。
我必须添加以下构建后操作(右键单击具有.dll输出的项目),然后添加属性->配置属性->构建事件->构建后事件->命令行
现在,我添加了这两行以将输出dll复制到两个文件夹中:
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Release
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Debug
(此答案仅适用于C#,不适用于C ++,对不起,我误读了原始问题)
我以前已经通过DLL地狱了。我的最终解决方案是将非托管DLL作为二进制资源存储在托管DLL中,并在程序启动时将其提取到一个临时文件夹中,并在处理该程序时将其删除。
这应该是.NET或pinvoke基础结构的一部分,因为它非常有用....它使托管DLL易于管理,无论是使用Xcopy还是作为较大Visual Studio解决方案中的Project引用。完成此操作后,您不必担心生成后事件。
更新:
我在另一个答案https://stackoverflow.com/a/11038376/364818中在这里发布了代码
在project.csproj文件中添加内置的COPY :
<Project>
...
<Target Name="AfterBuild">
<Copy SourceFiles="$(ProjectDir)..\..\Lib\*.dll" DestinationFolder="$(OutDir)Debug\bin" SkipUnchangedFiles="false" />
<Copy SourceFiles="$(ProjectDir)..\..\Lib\*.dll" DestinationFolder="$(OutDir)Release\bin" SkipUnchangedFiles="false" />
</Target>
</Project>
xcopy /y /d "$(ProjectDir)External\*.dll" "$(TargetDir)"
您也可以参考相对路径,下一个示例将在项目文件夹上方一层的文件夹中找到DLL。如果您有多个在单个解决方案中使用DLL的项目,则将DLL的源设置为“启动项目”时,会将其放置在可访问的公共区域中。
xcopy /y /d "$(ProjectDir)..\External\*.dll" "$(TargetDir)"
该/y
选件未经确认即被复制。该/d
选项检查文件是否存在于目标中,并且仅在源具有比目标新的时间戳时才进行复制。
我发现至少在较新版本的Visual Studio中,例如VS2109,$(ProjDir)
是未定义的,必须使用它$(ProjectDir)
来代替。
保留目标文件夹xcopy
应默认为输出目录。$(OutDir)
仅了解原因无济于事,这一点很重要。
$(OutDir)
,至少在最新版本的Visual Studio中,定义为输出文件夹的相对路径,例如bin/x86/Debug
。单独使用它作为目标将从项目输出文件夹开始创建一组新文件夹。例如:… bin/x86/Debug/bin/x86/Debug
。
将其与项目文件夹结合在一起将使您到达正确的位置。例如:$(ProjectDir)$(OutDir)
。
但是$(TargetDir)
将一步提供输出目录。