代码之家  ›  专栏  ›  技术社区  ›  Ahmad

有没有更好的方法将本机dll复制到bin文件夹?

  •  14
  • Ahmad  · 技术社区  · 14 年前

    我试过以下方法

    1. $(TargetFolder)

      copy "$(ProjectDir)Libs\NQuantLibc.dll" "$(TargetDir)NQuantLibc.dll"

    2. 将本机dll作为现有项包含在项目中(添加->现有项->包含dll)。此选项允许我使用“复制本地”选项。这种方法的缺点是dll总是显示为项目项。

    bin/debug/Libs/NQuantLibc.dll

    以上两种方法都有效。有没有更好的方法将本机dll复制到bin文件夹,以便始终解决依赖关系?或者,对这种情况有不同的处理方法吗?

    6 回复  |  直到 14 年前
        1
  •  30
  •   Hans Passant    14 年前

    使用Project+添加现有项并选择DLL。在解决方案资源管理器窗口中选择添加的文件。在Properties窗口中,将Copy to Output Directory设置更改为“Copy if newer”。

        2
  •  17
  •   Yochai Timmer    9 年前

    您可以将本机dll添加为链接项,并使用“ 更新时复制 ".

    您可以编辑项目的.csproj并有条件地链接本机dll:

     <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|Win32' ">
        <Content Include="..\..\bin\Win32\Release\NQuantLibc.dll">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>
     </ItemGroup>   
     <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|Win32' ">
        <Content Include="..\..\bin\Win32\Debug\NQuantLibc_d.dll">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>
      </ItemGroup>
      <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
        <Content Include="..\..\bin\x64\Debug\NQuantLibc_d.dll">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>
      </ItemGroup>
      <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
        <Content Include="..\..\bin\x64\Release\NQuantLibc.dll">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>
      </ItemGroup>
    

    保存最新

        3
  •  5
  •   Floyd    9 年前

    找到了更好的方法。Nuget可以将存储在包的build文件夹中的.targets文件添加到项目中。通过这种方式,您可以在每次构建时将包中的一些文件复制到任何需要的地方。在下面的示例中,我将一些非DotNet DLL存储到“binaries”文件夹中。在每次生成时,它检查是否已经在输出文件夹($OutputPath variable)中复制了DLL,并在必要时复制它们。

    Nuspec内容:

    <?xml version="1.0" encoding="utf-8"?>
    <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
        <metadata>
            <id>Example</id>
            <version>1.0.0</version>
            <authors>Example</authors>
            <requireLicenseAcceptance>false</requireLicenseAcceptance>
            <description>Example</description>
        </metadata>
        <files>
            <file src="Non-DotNet.dll" target="binaries\Non-DotNet.dll" />
            <file src="DotNet.dll" target="lib\net40\DotNet.dll" />
            <file src="Example.targets" target="build\Example.targets" />
        </files>
    </package>
    

    示例.目标内容:

    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <Target Name="CopyBinaries" BeforeTargets="BeforeBuild">
            <CreateItem Include="$(MSBuildThisFileDirectory)..\binaries\**\*.*">
                <Output TaskParameter="Include" ItemName="PackageBinaries" /> 
            </CreateItem>
    
            <Copy SourceFiles="@(PackageBinaries)"
                  DestinationFolder="$(OutputPath)"
                  SkipUnchangedFiles="true"
                  OverwriteReadOnlyFiles="true"
            />
        </Target>
    </Project>
    
        4
  •  1
  •   Adrian Zanescu    14 年前

    将dll作为文件添加到项目中(“as link”,如果您仍然希望它驻留在另一个目录中的话)。然后将构建操作设置为content,并将Copy to output directory设置为true。

        5
  •  1
  •   Igal Tabachnik    14 年前

    如果您对创建的“Libs”文件夹满意,可以尝试将其添加到 probing path 对于您的应用程序,在 app.config 文件:

    <configuration>
       <runtime>
          <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
             <probing privatePath="Libs;Bin2"/>
          </assemblyBinding>
       </runtime>
    </configuration>
    

    编辑 不幸的是,这个 does not impact the unmanaged DLL loading by DllImport .

        6
  •  0
  •   jdamp    6 年前

    显然,我碰巧遇到了同样的问题,但我不太想编辑项目文件,因此我最终使用了以下生成后脚本:

    xcopy /y "$(ProjectDir)\lib_$(Platform)\*.dll" "$(ProjectDir)$(OutDir)"

    只需确保为每个需要的目标平台都有一个文件夹,例如: lib_x86 lib_x64 lib_AnyCPU