5

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

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

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

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

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

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

4

4 回答 4

6

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

于 2009-04-19T08:39:08.043 回答
3

我目前有一个非常相似的问题。

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

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

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

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

我希望这对您有所帮助。

编辑:

Further investigations showed that the Wrapper .DLL always finds the native .DLL...that's the good thing. The bad thing is that the Visual Studio Designer copies the needed assemblies to a temporary directory (somewhere inside the user directory) when you open a form. When it copies the assemblies it ignores the linked resources and by this the native .DLL!

于 2009-05-08T06:01:38.030 回答
0

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

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

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

看起来 2) 已经在 Stack Overflow 上得到了回答

于 2009-04-19T06:04:37.633 回答
0

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

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

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

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

于 2009-04-19T08:03:20.580 回答