在.NET项目中复制本机DLL的最简洁方法

时间:2009-10-05 16:22:38

标签: c# dll msbuild managed-c++

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

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

  

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

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

什么不起作用

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

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

就干净的项目而言,最好是将所有代码文件插入项目的子文件夹中,并在根目录下安装DLL以使第一个解决方案有效吗?

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

  

xcopy“$(ProjectDir)必需的DLL *。*”“$(TargetDir)”/ Q / Y

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

2 个答案:

答案 0 :(得分:6)

您可以使用post-build事件将目录的内容(例如,“Required DLLs”目录)复制到项目的输出目录中。

答案 1 :(得分:0)

  1. 你可以使用静态库而不是动态,它会让你的dlls更大但是单个dll而不是多个只是节省时间而不仅仅是你的方面。
  2. 将解决方案中的所有项目路由到一个目录(托管和非托管)。