26

我有两个项目。第一个是 Windows 窗体应用程序项目,第二个是类库项目。Сlass 库项目与FANN一起使用。Windows 窗体是启动项目。

我应该有Fann.Net.dll 和 fanndoubleMT.dll 与 FANN一起工作。我下载了这些库并将它们放在位于解决方案根目录中的文件夹lib中。

我将 Fann.Net.dll 作为外部 dll 添加到类库项目中。我编译了这个项目。我收到一条错误消息,提示“无法加载 DLL 'fanndoubleMT.dll'。我通过将 fanndoubleMT.dll 添加到文件夹 Windows_Forms_Application\bin\Debug 来修复此错误。

我认为这是一个糟糕的解决问题的方法,因为我使用 git,并且每次都需要将 dll 传输到新工作场所上的这个文件夹中。

真诚的,丹尼斯。

4

7 回答 7

47

你可以试试这个:

  1. 添加/现有项目,而不是添加参考。
  2. 使用添加为链接。
  3. 确保将项目复制到构建文件夹中。在 VS 库的属性中,将 Build Action 设置为 Content 并将 Copy to Output Directory 设置为 Copy if Newer。
  4. 完毕。重建和测试。

在链接http://social.msdn.microsoft.com/Forums/en-US/1b1b316a-8648-4243-a651-84de51fd2508/reference-native-dll-from-managed-c-project?forum=vssmartdevicesvbcs中建议。

于 2013-10-19T11:32:12.350 回答
12

您可以将本机 dll 添加为链接项,并使用“如果较新则复制”。
本机 dll 的问题在于,有时您需要根据项目的配置(调试/发布或平台)使用不同的 dll。

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

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

请注意,复制选项设置为PreserveNewest,这意味着“如果较新则复制”。

于 2015-10-30T12:48:26.327 回答
7

liang 编写的上述解决方案仅适用于平面项目结构!您可能希望将解决方案中的所有 DLL 组织到一个名为“Dependecies”的文件夹中。但请注意,文件是相对于解决方案资源管理器中的项目结构复制的。(使用 Visual Studio 2015 测试)

  1. 在解决方案资源管理器中创建文件夹依赖项
  2. 添加/现有项目,而不是添加参考。
  3. 使用添加为链接。
  4. 在 VS 库的属性中,将 Build Action 设置为 Content 并将 Copy to Output Directory 设置为 Copy if Newer。

现在您应该具有以下解决方案资源管理器结构:

Your Project
- class1.cs
- Dependencies\Fann.Net.dll
- Dependencies\fanndoubleMT.dll

添加构建后步骤:

xcopy "$(TargetDir)\Dependencies" "$(TargetDir)"  /s /e /h /Y

这种将文件添加到项目和创建后期构建步骤相结合的解决方案具有以下优点:

  • 项目组织良好
  • 如果稍后有人向解决方案资源管理器添加新的依赖项,则无需修改构建后步骤,
  • 如果您使用颠覆,它将重置存储库中锁定文件的只读标志
于 2018-04-13T12:49:13.397 回答
5

您不能“添加引用”到非托管 dll。一种解决方案是在您的 Windows 窗体项目中添加一个生成后事件。类似于: xcopy ..\lib\fanndoubleMT.dll $(TargetPath) 构建后事件还可以执行 .cmd 或 .bat 文件

您仍然需要对托管程序集“Fann.Net.dll”的引用

于 2013-05-07T17:04:46.330 回答
0

如果 dll 不在项目 bin 文件中,则应允许复制 dll。

  1. 右键单击您的dll

  2. 点击属性

  3. 如果复制到输出目录是不复制,请选择始终复制

  4. 重建项目。它会出现。

于 2017-12-07T07:27:05.307 回答
0

就我而言,我必须单击“程序集”选项卡中的浏览按钮才能找到我的 dll。

于 2022-02-04T13:53:24.857 回答
-2
  1. 右键单击您的项目
  2. 选择添加,然后参考...
  3. 在 Reference Manager 窗口中,单击 Browse...(位于底部)。
  4. 找到您的 .dll,然后按添加。
于 2016-12-02T15:04:43.250 回答