【问题标题】:Cleanest Method for copying Native DLLs in a .NET Project在 .NET 项目中复制本机 DLL 的最简洁方法
【发布时间】:2009-10-05 16:22:37
【问题描述】:

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

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

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

这会使项目的基础文件夹在某些情况下成为一堆 DLL,所有这些都是引用项目的要求,而不是项目本身。

什么不起作用

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 无论出于何种原因,我什至没有想到构建后的事件。这对我来说效果很好,我已经发布了我在问题中使用的确切的后期构建。谢谢。
    【解决方案2】:
    1. 您可以使用静态库而不是动态库,这会使您的 dll 更大,但单个 dll 而不是多个只是节省时间,而且不仅在您的方面。
    2. 将解决方案中的所有项目路由到单个目录(托管和非托管)。

    【讨论】:

    • 静态库对我来说没问题,但我从来没有运气好在托管 C++ 中为它们设置项目。您有什么建议或资源可以帮助我进行设置吗?
    • @Guard 你不能做静态托管 c++ 库,我认为托管 c++ 需要的库有问题(那些可以是静态的)。
    猜你喜欢
    • 2014-07-05
    • 2018-07-29
    • 2015-08-29
    • 2012-09-01
    • 2016-12-25
    • 2023-03-20
    • 1970-01-01
    • 2011-07-26
    相关资源
    最近更新 更多