2011-04-29 56 views
1

通常,我的exe文件具有dll依赖项,我使用安装程序打包,如nsisinno。 这对大型程序很有意义,但对于小型脚本来说是过分的。如何在exe中捆绑依赖关系

是否有一种替代方法来捆绑依赖关系,以便用户可以只执行一个exe文件而不需要PATH中的dll目录?


编辑

我希望这将不依赖于DLL的类型,并为其他类型的依赖关系工作了一个解决方案。

这里有一些可能的备选方案:

有没有人有这样的工具的经验吗?

+0

大多数有经验的开发人员会建议您不要使用这些工具,而是在安装EXE和DLL到同一目录中的传统的东西。你似乎不想遵循这个建议。既然你已经习惯使用这些工具之一,为什么你不这样做呢? – 2011-04-30 04:08:16

+0

我总是有过去,但目前我分发了很多小脚本,客户端不喜欢依赖文件夹。 – hoju 2011-05-01 23:16:20

回答

2

好吧,你不喜欢或者我的其他两个想法...所以这里去...

你的船,并给你的客户一个“存根EXE”。存根EXE不依赖于其他任何东西,只是包含一个ZIP文件(或安装程序包或类似)作为存根EXE中的资源。嵌入在存根EXE中的zip文件只包含实际的程序EXE及其所有依赖的DLL。当存根EXE运行时,它只是将ZIP文件解包到TEMP子目录并启动应用程序EXE。

你可以对其进行优化,例如,如果应用程序已经被安装在%TEMP%,那么你可以跳过拆包步骤,而直接启动应用程序EXE已经存在。

就个人而言,我不会走这条路。如果EXE具有依赖关系,只需给用户一个安装程序即可。但你比我更了解你的用户和客户。

+0

只需设置一次点击应用程序来处理所有这些问题不是更容易吗? – pjwilliams 2011-04-30 23:34:37

+0

这可能是甚至可以直接从该存根exe文件加载所有必需的文件,但是,这将是很难实现不仅仅是所有必需的文件解压缩到一个临时目录,并从那里开始的主要应用。 – 2011-05-02 10:10:05

+0

我同意,这就是为什么我在上面的最后一行中建议“给用户一个安装程序......”。 – selbie 2011-05-03 03:23:07

1

一种替代方法是在GAC中安装DLL。

+0

你能详细说明这是怎么完成的吗? – hoju 2011-04-29 15:18:24

2

您可以静态链接可执行文件。

+0

不适用于我的特殊情况 – hoju 2011-04-29 05:24:54

1

你没有提到DLL依赖关系是什么。只用一个存根库直接连接DLL?通过LoadLibrary动态加载? COM?需要注册吗?这是.NET的任何一个?

需要考虑的几个选项。

  1. 将所有需要的DLL放在与EXE相同的目录中(因此您不必使用PATH变量)。安装只是一个“复制*。*”或只是允许从文件共享运行。 (如果有.NET代码,则为YMMV - 因为从远程文件共享运行时具有安全限制)。

  2. 使用C-Runtime而不是动态选项静态链接EXE(因此,您不必在尚未安装它的计算机上重新生成MSVCRT)。

我有一些疯狂的想法,如果上述2项不足。让我知道。

+0

我想避免使用dll的目录,这可能会让我的用户感到恐惧和困惑。 – hoju 2011-04-29 15:19:51

+0

静态链接不是一个选项 – hoju 2011-04-29 15:20:18

0

显然存在software可以将DLL转换为LIB,以便您可以静态链接它,但在这种情况下可能会矫枉过正。

相关问题