【问题标题】:Copy third party assemblies to sub folder将第三方程序集复制到子文件夹
【发布时间】:2014-03-26 11:15:33
【问题描述】:

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

现在我正在寻找一种将第 3 方 dll 自动复制到自定义子目录中的方法。我知道从与应用程序根目录不同的位置(app.config 或代码中的私有路径)加载程序集的各种方法,但不知道如何自动将它们复制到那里。

所需结构

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!

【问题讨论】:

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


    【解决方案1】:

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

    1. 添加一个dll项目:placeholder.csproj
    2. 创建文件夹“lib”
    3. 创建子文件夹“ninject”
    4. 将文件“Ninject.dll”添加到该文件夹
      1. 将 BuildAction 设置为“内容”
    5. 添加 placholder.csproj 作为对您的主项目的引用
    6. 构建

    Content 文件(但实际上是您的 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 目标的文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多