如何静态链接.DLL?

问题描述:

我们有一个由VS构建的(纯原生C++).DLL。作为客户端,我们有一些本地的C++应用程序和围绕以C++/CLI编写的DLL的.Net-Wrapper。最后还有一些用C#编写的.Net-Wrapper的客户端应用程序。如何静态链接.DLL?

我的问题是native.dll必须以不同于.Net世界的方式进行分发,并且VS不会跟踪该DLL。因此,为了让所有C#应用程序都能正常工作,我必须将其复制到每个可执行文件目录,或者将其放在%PATH%(我会避免在开发人员计算机上,因为他们可能想用不同版本的DLL启动不同的应用程序) 。 如果存在引用Wrapper-DLL的UserControl,则会出现更大的问题:您必须将DLL复制到VS的目录或再次复制到%PATH%。 但最糟糕的情况发生在我们的翻译工具中。该工具跟踪.Net-Assemblies并将其打包成可发送给外部翻译器的翻译包。据我所知,没有办法将本地.DLL放入该包中!

因此,我打算将本机DLL静态链接到.Net-Wrapper中,以解决我的问题。 但是对于我们的Native应用程序,这个本机DLL必须仍然是一个DLL。

所以,我有两个选择:

  • 作出这样的两个项目(一个生成静态库,创建一个动态的,一个=>我会尽量避免这一点)
  • 寻找解决方案链接DLL的静态
  • 找到一种方法,让VS从一个项目
+0

我可能有点愚蠢在这里,但我不明白为什么你的本机应用程序不能使用本地dll,并且.net应用程序使用C++/cli-wrapped dll。 – Niklas 2009-01-08 12:16:29

+0

他们都可以。但是Wrapper-DLL引用了本地DLL,因此我的C#应用​​程序需要这两者。这对包装来说是可以的,但对本地DLL的屁股很痛苦。 – mmmmmmmm 2009-01-08 12:50:19

+0

为什么不建立一个DLL的DLL?你说你用VS编译dll,不是吗? – 2009-01-08 12:52:17

产生两个输出拿起DLL to Lib复印件(编辑:如果你不能找到一个便宜的选择)

+6

有点贵,不是吗? – mmmmmmmm 2009-01-08 12:28:48

另一个选择是有两个项目,一个项目将输出一个可以静态链接的.lib,另一个项目将输出一个.dll并将.lib作为依赖项,您应该添加.def以您的.dll文件中包含您计划导出的符号,否则它将为空。

在dll的C++项目文件中,创建两个配置,一个生成一个DLL,一个生成.lib。两个项目不是必需的,因为任何.NET/C++项目都可以支持多种构建配置(这就是Release和Debug版本构建方式的不同)。

您可以生成一个DLL和使用dllexport切入点导出到一个lib,这是这里解释

http://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx