互操作、本机DLL和Visual Studio构建过程

本文关键字:Studio 构建 过程 Visual 本机 DLL 互操作 | 更新日期: 2023-09-27 18:29:16

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

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

  1. Project1:本机DLL互操作包装器,用于导入本机.DLL
  2. Project2:一个WinForms项目,用于调用Project1所包含的包装器
  3. Project3:一个MSTest项目,用于调用Project1Project2所包含的包装器

我已将Native.dll包含在Project1中,并将其配置为复制到输出文件夹中。

此安装程序将导致DllImport失败,表示找不到目标dll。原因很简单。我正在运行项目2或3,在每种情况下:

  • Project2:生成时,它复制生成过程生成的Project1.dll,但不复制Native.dll。运行代码时,文件夹为$ProjectDir''bin''Debug(或release),Native.dll不可用。

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

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

有没有一种简单的方法来纠正这个项目简单地说,我的意思是我希望避免使用后期构建来复制或其他手动过程。我还想尽量避免使用绝对路径来复制.dll.

我正在使用Visual Studio 2010。

谢谢!

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

换句话说,如果项目p[a]有一个具有"复制到输出"规则的项X,并且p[B]引用了它,则p[B]也复制了X。但是,如果p[C]引用了p[B],则它忽略了复制规则

互操作、本机DLL和Visual Studio构建过程

在项目中添加对"Native.dll"的引用。在文件的属性窗口中,将"Build Action"设置为"None",将"Copy to Output Directory"设为"Always"或"Copy if Newer"