跟踪用于将本机C ++ DLL包装到.NET的DLL依赖项

时间:2009-04-19 05:40:32

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

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

在思考了我/已知/可以找到的所有选项(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的引用,而只能运行

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

编辑:mergebin似乎最接近我正在寻找的,但它只能将.NET DLL与一个本机DLL合并。太糟糕了,无法合并本机DLL。

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

我目前遇到了类似的问题。

通过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 Designer会将所需的程序集复制到临时目录(用户目录中的某个位置)。当它复制程序集时,它会忽略链接的资源,并由此忽略原生的.DLL!

答案 2 :(得分:0)

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

  1. 如何在构建开始之前复制本机代码dll
  2. 如何动态找出需要复制的本机代码依赖项,以防它们发生变化。
  3. 对于1),您可以在C#项目中使用预构建步骤来调用自定义util来复制正确的文件。

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

答案 3 :(得分:0)

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

项目 - > MyProjectName属性... - >建立活动

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

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