【问题标题】:Interop, Native DLL and Visual Studio build process互操作、本机 DLL 和 Visual Studio 构建过程
【发布时间】:2012-03-28 21:43:37
【问题描述】:

令人困惑的标题,令人困惑的问题,但我希望我能引起您的注意。言归正传:

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

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

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

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

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

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

在这两个例子中,DLL都被复制到了Project1的debug文件夹中,没有用。

有没有一种简单的方法来纠正这个项目?简单的意思是我想避免使用 Post Build 来复制或其他手动过程。我还想尝试避免使用绝对路径来复制 .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],它忽略了复制规则。

【问题讨论】:

  • 但是后期构建操作似乎非常适合这种情况,而且它只是一个复制命令,还不够简单吗?
  • @SofianHnaide,我认为 Post Build 行不通,因为我需要将绝对路径传递给它,而在 Test 项目的情况下,我无法确定输出路径。有没有办法做到这一点?

标签: c# visual-studio


【解决方案1】:

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

【讨论】:

  • Ritch,这会将 Native.dll 复制到 Project1 输出文件夹($ProjectDir\bin\Debug 或 Release),但引用 Project1(Project2 和 Project3)的项目不会自己复制 dll。除非你建议我在每个项目中都粘贴引用。
  • @Bruno - 哪些项目需要 DLL 才能运行?我会在这些项目中提供参考。
  • 罢工!它复制到 Project2,问题发生在引用 Project2 的项目上。我的例子是错误的...... Project3 实际上引用了 Projec2。你能帮帮我吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 2018-05-10
  • 2011-02-14
相关资源
最近更新 更多