在Visual Studio中复制DLL的依赖关系
如何在Visual Studio中设置项目来复制项目引用所依赖的第三方DLL?
我有一个主要的应用程序项目和一个类库DLL。 主应用程序引用了类库DLL,而DLL本身引用了一些第三方DLL。 当我编译主应用程序时,它会自动将类库DLL复制到其输出目录,但不会复制第三方DLL。
我不想从主应用程序项目中添加对第三方DLL的引用,因为主应用程序不使用它们,它们只被类库使用。
你可以通过项目属性窗口来实现。 Visual Studio允许您定义在构build之前或之后发生的事件。 要进入项目属性窗口,只需右键单击解决scheme资源pipe理器窗口中的项目,然后单击“属性”。 从左侧进入“构build事件”选项卡。
在后期编译框中键入一些复制命令。 例如:
copy "$(SolutionDir)mydll.dll" "$(TargetDir)"
$(SolutionDir)
和$(TargetDir)
都是预定义的variables。 标准语法如下所示:
copy "source directory and file name" "destination directory"
如果你点击'edit post build …'button,它会popup一个框,其中列出了可以插入的预定义variables(如$(SolutionDir)
和$(TargetDir)
)
作为一个方面说明,这是一个复制其他文件,如自定义configuration文件,图像,或任何其他依赖您的项目可能有用的过程。
下面的片段适合我:
<Project> ... <ItemGroup> <Content Include="Path\to\dll\dllname.dll"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup> ... </Project>
这适用于C#。 对于本机C ++,它仍然复制DLL到输出文件夹,但是这种依赖在Visual Studio中是不可见的,它应该直接在项目文件中编辑。
为了testing非平凡的例子,我尝试运行C#项目A,它依赖于本地C ++项目B. B项目依赖于第三方本地DLL C – 此依赖项通过项目文件中的上述片段实现。 当我build立一个,C被复制到二进制文件夹。
我在Visual Studio 2010中试过。
看看由Alex Yakunin提供的这个解决schemehttp://blog.alexyakunin.com/2009/09/making-msbuild-visual-studio-to.html它对我的工作非常好 – DevExpress库明确使用的场景其他依赖性在部署时引起问题)
- 注1:Visual Studio 2010似乎自动添加引用的dll,但msbuild没有。 所以Alex的解决scheme从使用msbuild的发行脚本开始工作。
- 注2:也必须确保对于引用的库(在代码中引用的库)copy-local在csproj中实际上设置为True,即使解决scheme资源pipe理器说它是。 最好的办法是设置copy-local = False,保存,设置copy-local = True,保存。
这两个步骤 – 对引用库复制本地= true,并为间接引用添加msbuild目标为我自动构build设置。
我不会推荐这样做。 最终在被复制的程序集数量(可能正在重build)中出现N ^ 2爆炸。 如果可能的话,你应该把所有的项目都放在同一个$(OutDir)中。 如果您使用的是TFS,Team Build可以为您做到这一点。
转到主应用程序,引用,到您的类库引用。
将“复制本地”设置为“真”。
它现在将把类库的bin目录复制到主应用程序bin目录中。 包括任何子依赖项第三方dll。
我不喜欢有我的依赖项文件位于项目根文件夹,但在子文件夹中。 但是这些文件必须放在build文件夹的根目录下。
我的构build事件如下所示:
Command: call xcopy /S /Y "$(SolutionDir)Dependencies\*.*" "$(TargetDir)"
如果“依赖”也包含子文件夹,就像我的一样。
100%确定这将工作。 只需将dllreplace为您的个人参考。 文件
<Reference Include="Xceed.Wpf.Toolkit"> <HintPath>..\..\..\3rdParty\Extended WPF Toolkit-2.2.1\Xceed.Wpf.Toolkit.dll</HintPath> <CopyToOutputDirectory>Always</CopyToOutputDirectory> <SpecificVersion>False</SpecificVersion> </Reference> <Content Include="..\..\..\3rdParty\Extended WPF Toolkit-2.2.1\Xceed.Wpf.Toolkit.dll"> <Link>Xceed.Wpf.Toolkit.dll</Link> <CopyToOutputDirectory>Always</CopyToOutputDirectory> <SpecificVersion>False</SpecificVersion> </Content>
除了在项目本身中添加对.dll的引用之外,我并不知道有任何其他的方法可以做到这一点。 我们在这里的一些自己的项目中已经遇到了这个问题,我们唯一find的解决scheme是添加参考。 我想说的是,我们的开发人员做了一些研究,发现这是唯一的解决scheme,但是不要在此引用我的意思。