Interop,Native DLL和Visual Studio构建过程

时间:2012-03-27 23:12:15

标签: c# visual-studio

令人困惑的标题,令人困惑的问题,但我希望我能引起你的注意。要点:

我有一个包含三个项目的VS解决方案。

  1. Project1 :原生DLL互操作包装,导入 Native.dll
  2. Project2 :一个WinForms项目,用于调用Project1包含的包装器。
  3. Project3 :一个MSTest项目,用于调用 Project1 Project2包含的包装器。
  4. 我在 Project1 中包含了Native.dll,并将其配置为复制到输出文件夹。

    此设置将导致DllImport失败,表示无法找到目标dll。原因很简单。我正在运行Project 2或3,并且在每种情况下:

    • Project2:构建时,它会复制构建过程生成的Project1.dll,但不会复制Native.dll。运行代码时,该文件夹是$ ProjectDir \ bin \ Debug(或release),并且Native.dll不可用。

    • Project3:这是一个MSTest项目;当要求运行所有测试时,它会编译应用程序并将输出exe和dll复制到输出文件夹。但是它不会复制Native.dll。

    在这两个示例中,DLL都被复制到Project1的调试文件夹中,这是无用的。

    有没有一种简单的方法来纠正这个项目?简单来说,我的意思是我想避免使用Post Build进行复制或其他手动过程。我还想尝试避免使用绝对路径来复制.dll。

    我正在使用Visual Studio 2010。

    谢谢!

    UPDATE:上面的场景说明Project3引用了Project1,但实际情况并非如此。 Project3引用Project2,引用Project1。在这种情况下,Native.dll将复制到Project2输出文件夹,但不会复制到Project3输出文件夹。我还添加了类库类型的Project4,添加了对Project2的引用,它也没有复制。

    换句话说,如果项目P [A]的项目X具有“复制到输出”规则并且P [B]引用它,则P [B]也复制X.但是,如果是P [C]引用P [B],它忽略了复制规则。

1 个答案:

答案 0 :(得分:5)

在项目中添加对“Native.dll”的引用。在文件的属性窗口中,将“构建操作”设置为“无”,将“复制到输出目录”设置为“始终”,或“复制如果更新”