我们C#包装码,电话职能从一个司机(C++)dll。目前,我可以添加一个参考C#dll和已设置的复制本地选择正确的。然而本机dll,这是一个依赖性,不能将加入作为参考-所以没有复制地方选项。

我已经尝试过下列方法

  1. 使用后建立的事件复制本机dll从库文件夹 $(TargetFolder)

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

  2. 包括本机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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top