【问题标题】:Track DLL dependencies for wrapping a native C++ DLL to .NET跟踪 DLL 依赖项以将本机 C++ DLL 包装到 .NET
【发布时间】:2009-04-19 05:40:32
【问题描述】:

我有一个想要向 .NET 应用程序公开的 C++ DLL(无代码)。

在考虑了我拥有/知道/可以找到的所有选项(COM、P/Invoke、SWIG 等)之后,我正在编写一个 .NET 类库(在 C++/CLI 中)。现在生成的 DLL(类库)也需要原始 DLL 及其依赖项。我的问题在于自动跟踪此类事情,以便使用包装器的应用程序不必跟踪其他(本机)DLL(特别是如果原始 DLL 开发了新的依赖项)。

更准确地说(并且有一些具体的事情要讨论),我试图包装cmr,所以我写了MR,类库(自然依赖于cmr)。 cmr 取决于 PNLOpenCV 等。当我尝试在 (C#) 项目中添加对 MR 的引用时,Visual Studio (2005 SP1) 只是复制了 MR.DLL,留下了所有依赖项,然后抱怨(抛出 FileNotFoundException 关于缺少模块)。手动将cmrPNL等复制到bin目录即可解决问题。

事不宜迟,我的问题是:.NET 应用程序有没有办法只添加对一个 DLL 的引用,而一切正常工作

我一直在搜索谷歌和 SO,但无济于事......

编辑:mergebin 似乎最接近我正在寻找的内容,但它只能将 .NET DLL 与一个本机 DLL 合并。可惜不能合并原生 DLL。

【问题讨论】:

    标签: c# dll interop c++-cli


    【解决方案1】:

    您可能会查看mergebin,这是一种允许您将非托管和托管 DLL 组合到一个程序集中的工具。 System.Data.SQLite 使用这种方法。

    【讨论】:

      【解决方案2】:

      我目前遇到了一个非常相似的问题。

      实现我的目标的一大步是通过 C++/CLI 项目中的预构建步骤将 Native .DLL 复制到输出目录并添加链接器选项

      /ASSEMBLYLINKRESOURCE:"$(OutDir)\Native.dll"
      

      这会在生成的程序集中写入一个属于该程序集的文件“Native.dll”。现在所有引用该项目/程序集的项目也将复制 Native.dll! (如果你把你的程序集放在那里,它也应该进入 GAC - 我没有检查)。

      好的,您仍然需要添加所有依赖的 native.dll。 如果您通过 Assembly.LoadFrom() 从一个非常不同的路径加载程序集,我也不知道是否在运行时找到本机 DLL(这是我必须解决的问题,因为我们的 C++/CLI 包装程序集Visual Studio 设计器需要)。

      我希望这对你的问题有所帮助。

      编辑:

      进一步的调查表明,Wrapper .DLL 总是能找到本机 .DLL...这是好事。不好的是,当您打开表单时,Visual Studio 设计器会将所需的程序集复制到一个临时目录(用户目录内的某个位置)。当它复制程序集时,它会忽略链接的资源,从而忽略本机 .DLL!

      【讨论】:

      • +1 这是一个不错的方法。本机 dll 名称嵌入在托管 dll 的清单中。构建工具(至少在理论上)可以找出本地依赖项,尽管 dll 仍在四处飞来飞去。在 Web 部署场景中运行良好。
      【解决方案3】:

      听起来您有两个具体问题:

      1. 如何在构建开始前复制原生代码 dll
      2. 如何动态找出需要复制的本机代码依赖项,以防它们发生变化。

      对于 1),您可以在 C# 项目中使用预构建步骤来调用自定义工具来复制正确的文件。

      看起来 2) 已经是answered here on Stack Overflow

      【讨论】:

        【解决方案4】:

        好吧,作为构建过程的一部分,您可以简单地添加命令以自动将所需的 DLL 复制到正确的输出目录中。这是在 Visual Studio 中通过转到项目的属性来完成的。

        项目 -> MyProjectName 属性... -> 构建事件

        添加命令以将您需要的文件复制到 $(TargetPath) 中,您就完成了。

        另一种选择是简单地将项目的当前工作目录(仅当您从 Visual Studio 中运行它时)设置为您需要的所有 DLL 所在的目录。在外部执行程序时,您仍然需要手动复制文件,但这会使开发更容易一些。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-27
          • 1970-01-01
          相关资源
          最近更新 更多