是否有任何更好的方法来复制机dll到bin文件夹?
-
27-09-2019 - |
题
我们C#包装码,电话职能从一个司机(C++)dll。目前,我可以添加一个参考C#dll和已设置的复制本地选择正确的。然而本机dll,这是一个依赖性,不能将加入作为参考-所以没有复制地方选项。
我已经尝试过下列方法
使用后建立的事件复制本机dll从库文件夹
$(TargetFolder)
copy "$(ProjectDir)Libs\NQuantLibc.dll" "$(TargetDir)NQuantLibc.dll"
包括本机dll作为一个现有项目项目(加->的现有项目->包括dll)。这种选择允许我使用复制的本地'的选择。对这个缺点的办法是,dll总是显示了作为一个项目的项目。
我也尝试了"显示所有文件",其中允许我看到库的文件夹。我然后包括的NQuantLibc.dll 文件中的项目,该项目允许我设置复制地方选项。但是,这给了我一个意想不到的结果。它创造了一个Libs子文件夹中包含dll内bin文件夹(例如: bin/debug/Libs/NQuantLibc.dll
).不理想,因为C#dll是不能够正确地呼吁本机dll因为它不存在。
上述两个选项以上的工作。是否有任何更好的方法来复制机dll到bin文件夹中这种依赖性将始终是解决?或者,是否有一个不同的方法对这类情况?
解决方案
使用项目+增加现有项目和选择DLL。选择加入文件中的方案资源管理器窗口。在性窗口,变化的复制到输出目录的设定"复制如果较新的".
其他提示
你可以添加的机dll作为一个链接的项目,并使用"副本,如果较新的".
该问题与本地dll是,有时候,你会想到使用不同的dll根据该项目的配置(Debug/释放或平台)。
你可以编辑的项目。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>
注意复制的选择被设定为 PreserveNewest 这意味着"副本,如果较新的".
发现了一个更好的办法。Nuget可以添加。目标文件,巫婆都存储在建立文件夹中包,为项目。用这种方式可以复制在每个建立了一些文件包无论你想要的。在下面的例子中,我已经存了一些不DotNet DLL入一个"二进制文件"的文件夹。在每个建立,它的检查,如果Dll已经复制在输出的文件夹($OutputPath变量)和复制他们,如果必要的。
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>
添加dll作为一个文件中的项目("链接"或许如果你仍然想要它居住在另一个目录)。然后设定的建立行动内容和复制到输出的目录,以正确的。
如果你确定与创建"Lib"文件夹,你可以尝试将它添加到 探测路径 对于您的应用程序,通过添加以下的 app.config
文件:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="Libs;Bin2"/>
</assemblyBinding>
</runtime>
</configuration>
这将导致运行时看起来在所有指定的目录DLL。
编辑 不幸的是,这个 不会影响非托管DLL载的DllImport.
显然,我刚好也有同样的问题,但是我不想做的项目文件的编辑那么多,所以我最终使用以下的后建立脚本:
xcopy /y "$(ProjectDir)\lib_$(Platform)\*.dll" "$(ProjectDir)$(OutDir)"
只是确保你有一个文件针对平台的需要,例如: lib_x86
, lib_x64
也许和 lib_AnyCPU