将第三方程序集复制到子文件夹

时间:2014-03-26 11:15:34

标签: c# .net visual-studio visual-studio-2012 msbuild

我在我的项目中使用各种第三方程序集(本机,nuget包),这些程序集有时针对不同平台(x86 / amd64)进行了优化。 Visual Studio会自动将它们复制到应用程序根目录(通常是bin \ Debug \ PLATFORM),这会产生完全非破坏性的混乱。

现在我正在寻找一种方法来自动将第三方dll复制到自定义子目录中。我知道从应用程序根目录(app.config或代码中的privatePath)以外的其他位置LOAD程序集的各种方法,但不知道如何自动将它们复制到那里。

所需结构

bin\
    release\
        x64\
            MyApp.exe
            MyApp.exe.config
            cfg\
                custom.config
            lib\
                ninject\
                    Ninject.dll
                    Ninject.Extensions
                    Ninject.Extensions.Logging
                SomeNativeDll\
                    native_x64.dll
                OtherStuff.dll
        x86\
            ...

我已经找到了Post Build Events的方法,但是使用一些批处理脚本语言来声明每个引用都是PITA!

1 个答案:

答案 0 :(得分:4)

一种可能的解决方案是在您的结构中添加一个额外的项目。以下步骤重新创建:

  1. 添加一个dll项目:placeholder.csproj
  2. 创建文件夹' lib'
  3. 创建子文件夹' ninject'
  4. 添加文件' Ninject.dll'到那个文件夹
    1. 将BuildAction设置为' Content'
  5. 添加placholder.csproj作为对yourt主项目的引用
  6. 构建
  7. 内容文件(但实际上是你的dll)现在被复制到主项目输出文件夹中的相同文件夹结构中。

    为了支持平台特定的dll,它变得有点棘手。

    卸载项目并找到您的原生文件:

    <Content Include="test\Some_X86.dll" >
     <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    

    并为其添加条件

    <Content Include="test\Some_X86.dll" Condition="'$(Platform)' == 'x86'" >
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    

    如果您只想在输出中包含x86目标的文件。