6

我有一个引用托管 C++ 项目的 C# GUI 应用程序,它需要 7 个本机 C++ DLL。我正在寻找将这 7 个 DLL 复制到最终项目输出的最干净的方法。

什么有效
将所有 DLL 添加到 C# 应用程序,指定:

构建操作 == “内容”
复制到输出目录 == 始终复制”

在某些情况下,这会使项目的基本文件夹变得一团糟,所有这些都是引用项目的要求,而不是项目本身。

什么不起作用

  • 使用上述设置将这些 DLL 添加到名为“Required DLLs”的文件夹中。它将其复制到输出中具有相同名称的文件夹中,导致它们位于错误的位置。我看不到指定输出目录的方法。
  • 嵌入式资源:在 C# P/Invoke 中,您可以将引用的 DLL 添加为嵌入式资源,并将 DLL 嵌入到最终库中。我在托管 C++ 中看不到这种可能性,我什至不确定它是否适用于引用链。
  • 将 DLL 作为内容添加到托管 C++ 项目中。这些文件不会被复制到输出目录。

在这种情况下,最好的解决方案是什么?如果可能的话,我希望托管 C++ 项目能够处理它自己的 DLL 要求,并且最好以一种不会阻止该项目跨多个应用程序使用的方式。

就拥有一个干净的项目而言,最好将我的所有代码文件插入项目的子文件夹中,并将 DLL 放在根目录以使第一个解决方案工作?

解决方案:
使用 Joseph 的构建后建议,以下命令可以使用“Required DLLs”文件夹。

xcopy "$(ProjectDir)Required DLLs*.*" "$(TargetDir)" /Q /Y

/Q 隐藏输出中的单个文件,并且 /Y 禁止覆盖提示。

4

2 回答 2

6

您可以使用构建后事件将目录(例如,“必需的 DLL”目录)的内容复制到项目的输出目录中。

于 2009-10-05T16:37:47.887 回答
0
  1. 您可以使用静态库而不是动态库,它会使您的 dll 更大,但单个 dll 而不是多个只是节省时间,而且不仅在您的方面。
  2. 将解决方案中的所有项目路由到单个目录(托管和非托管)。
于 2009-10-05T16:30:26.823 回答