我有一个C ++ DLL(没有代码),我想向.NET应用程序公开。
在思考了我/已知/可以找到的所有选项(COM,P / Invoke,SWIG等)之后,我正在编写一个.NET类库(在C ++ / CLI中)。现在生成的DLL(类库)也需要原始DLL及其依赖项。我的问题在于自动跟踪这些事情,因此使用包装器的应用程序不必跟踪其他(本机)DLL(特别是如果原始DLL开发新的依赖项)。
为了更加精确(并且有一些具体要讨论的东西),我正在尝试包装cmr
,所以我写了MR
,类库(取决于cmr
,自然)。 cmr
取决于PNL
,OpenCV
和其他人。当我尝试在(C#)项目中添加对MR
的引用时,Visual Studio(2005 SP1)刚刚复制了MR.DLL
,留下了所有依赖项,然后抱怨(抛出FileNotFoundException
关于缺少模块)。手动将cmr
,PNL
等复制到bin
目录可解决问题。
不用多说,我的问题是:.NET应用程序是否只有一种方法可以添加对一个DLL的引用,而只能运行?
我一直在搜索Google和SO,但无济于事......
编辑:mergebin似乎最接近我正在寻找的,但它只能将.NET DLL与一个本机DLL合并。太糟糕了,无法合并本机DLL。
答案 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),您可以在C#项目中使用预构建步骤来调用自定义util来复制正确的文件。
看起来2)已经answered here on Stack Overflow了。
答案 3 :(得分:0)
嗯,您可以简单地添加命令以自动将所需的DLL复制到正确的输出目录中,作为构建过程的一部分。这可以通过转到项目的属性在Visual Studio中完成。
项目 - > MyProjectName属性... - >建立活动
添加命令将您需要的文件复制到$(TargetPath)中,然后就完成了。
另一种选择是简单地将项目的当前工作目录(当您从Visual Studio中运行时)设置为您需要的所有DLL所在的目录。在外部执行程序时,您仍然需要手动复制文件,但这会使开发变得更容易。