客户愤怒,与未知的 DLL 依赖作斗争
Posted
技术标签:
【中文标题】客户愤怒,与未知的 DLL 依赖作斗争【英文标题】:Customers angry, fighting unknown DLL dependencies 【发布时间】:2010-05-06 15:34:06 【问题描述】:我是一名为客户开发 C++ Windows 应用程序的单人节目。在过去的几个月里,我们一直在遇到同样的问题,即客户机器上缺少 DLL 依赖项。尽管我尽了最大的努力,但仍然出现问题,我们收到了愤怒的电子邮件。我的老板和我老板的老板生我的气,客户不高兴。
我希望你们能提供帮助,并就如何按顺序获得可交付成果提供建议/想法。在一些明显的之前:
-
我没有测试机。也就是说,我无法复制客户环境,也无法尝试将应用安装在“干净”的系统上以在发货前发现问题。
我尝试使用depends.exe 来跟踪我的项目所依赖的DLL 版本。我正在使用我能够找到的可再发行组件来发送我们的代码。之后,这是一场愤怒的客户电子邮件等待游戏。
我确实可以使用 64 位机器和 32 位机器来安装新版本。它总是在那里工作。
我需要使用无法注册的第三方 DLL(它的 bug 太糟糕了。)
我不应该使用 Install Shield、任何其他自动安装程序或编写安装脚本。
我提供了有关如何安装应用程序的书面说明(解压缩,双击 exe 文件。)
我厌倦了为这些东西发火。我错过了什么,我可以做什么? 在获得雇主的支持方面,我应该问些什么?我应该如何以他们会提供的方式请求这种支持?
更新:
虚拟机被鱼雷炸毁。他们不希望我将所有时间都花在设置和拆除客户配置上。相反,我现在正在与客户合作以获得基本配置,以便我知道我应该针对的确切机器设置。如果它不符合该规范,我不再需要关心。至少有些事情发生了……尽管我仍然想要一台测试机。
【问题讨论】:
您可以开始完善您的简历并寻找一份更好的工作。看起来他们同时要求您解决问题,同时拒绝您这样做。 如果您工作的公司买不起 199 美元的测试机,您认为生活会变得更好的原因是什么? 总是缺少相同的 DLL(或 DLL 集)吗?你能访问客户的网站吗(即使只是一次)?它是否适用于某些 PC 而不是其他 PC,或者您的软件的新版本在他们的所有 PC 上都失败了? @jon hanson - 某些计算机可以工作,而其他计算机则不能。不管它是我的代码的新版本还是旧版本。还有几个客户站点,每个站点都有自己的 Windows 配置。 目前的项目注定要失败。如果他们不相信你,也许你应该向你的雇主展示这个页面。 【参考方案1】:你应该退出。在你的辞职信中,你应该解释为什么这种情况很荒谬,让你和客户都感到沮丧。让我们回顾一下你所说的关于你的情况的事情:
我没有测试机。也就是说,我无法复制客户环境,也无法尝试在“干净”系统上安装应用程序以在发货前发现问题。
没有专业的开发公司会在没有安装测试的情况下发布产品。我们是一家非常小的公司,我们有大量的虚拟机,我们可以在上面运行测试和安装程序。
我尝试使用depends.exe 来追踪我的项目所依赖的DLL 版本。我正在使用我能够找到的可再发行组件来发送我们的代码。之后,这是一个愤怒的客户电子邮件等待游戏。
我确实可以使用 64 位机器和 32 位机器来安装新版本。它总是在那里工作。
这些都不算太糟糕或太奇怪。奇怪的是,您不知道自己使用的是什么 DLL,但除非您维护一个未记录的遗留系统,否则您的雇主对此无能为力 - 那么没有记录任何东西是他们的错。
很遗憾,您曾说过这些系统并不“干净”,因此很容易忘记成功安装产品实际需要哪些步骤。
我需要使用无法注册的第三方 DLL(它的 bug 太糟糕了。)
会发生这种情况。
我不应该使用 Install Shield、任何其他自动安装程序或编写安装脚本。
我提供了有关如何安装应用程序的书面说明(解压缩,双击 exe 文件。)
这太疯狂了。客户无法遵循基本指示。您被告知不要使用安装程序来使客户的生活更轻松这一事实几乎可以肯定是您的问题的原因。你不能说他们做了什么。当你问他们时,他们会撒谎或忘记他们做了什么……如果他们知道开始的话。您的雇主因该法令而导致严重的支持问题,而这种情况显然永远不会对您有所改善。
将此与第一个问题(没有足够的安装测试平台)联系起来,您的产品肯定会失败。你的客户应该生气,你也应该生气。你的雇主创造的情况不利于开发成功的产品。简而言之,在解决这些问题之前,您无能为力。
【讨论】:
“没有安装程序”是这里最重要的一点,当然。【参考方案2】:如果你没有测试机,你至少可以使用一个安装了干净 Windows 的虚拟机吗?
【讨论】:
我将如何向我的雇主要一个?在 XP 机器上启动和运行需要多少费用?另外,这些是否适用于许可证? 我建议从免费的开始,例如 Oracle 的 VirtualBox 或 Microsoft 的 VirtualPC。您只需要一个 Windows 许可证。 愤怒的客户与新 PC(或虚拟机)的成本是多少 下载 VirtualBox 的免费副本并在其中安装 XP。 你可以使用Oracle VM VirtualBox(免费),然后在上面安装Windows试试看。【参考方案3】:我没有测试机。也就是说,我无法复制客户环境,也无法尝试在“干净”系统上安装应用程序来捕获 发货前的问题。
这种类型的设置通常不会很好地结束。不管你有多好,你的开发机器和客户机器之间总会有很大的不同。一方面,Visual Studio 倾向于包含大量运行时,它可能使您的应用程序依赖于它而无需多言。设置虚拟机并不是很复杂。我使用VMWare Workstation 来模拟各种不同的机器。唯一的要求是您拥有要在虚拟机上安装的操作系统和程序的许可证。 VMWare 提供 30 天免费试用,之后我相信 189 美元。
【讨论】:
VMWare Server 是免费的,并且提供的功能基本相同。【参考方案4】:其他人给了你一个大局的答案;如果您无法采取更大的行动,这里有一些较小的建议可能会对您有所帮助:
列出您的应用程序所依赖的 DLL。如果您不确切知道您的应用程序依赖于什么,您如何确保依赖项可用? 编写一个实用程序来搜索并记录系统上这些 DLL 的任何实例,以及 DLL 版本和系统路径。如果用户遇到问题,此实用程序可能会大大帮助您解决问题,因为您已经提到您没有物理或网络访问权限来访问出现问题的机器。 编写一个除了LoadLibrary()
你的依赖项之外什么都不做的实用程序。可以记录故障,至少您可以轻松确定客户机器上的问题。
希望我们能迅速找出常见问题并进行修复,使它们不再是常见问题,并且您使用这些工具的需求将越来越少。但在您解决问题之前,它们可能会有所帮助。
另外,在一条评论中,您提到问题是由 Windows 系统 DLL 引起的 - 这些通常会在现代系统上导致很少的“DLL 地狱”问题,因为 3rd 方软件(包括您的)通常无法替换这些。所有 Windows 系统都应该获得 MS 提供的功能,并且 MS 在使新系统向后兼容方面做得很好(尽管不一定完美)。如果这些导致您出现问题,您可能希望发布它们是哪些 DLL(可能还有版本)的详细信息,以便人们可以回答更多细节,例如可能需要配置哪些内容以确保 Windows 安装程序安装 DLL。
【讨论】:
我喜欢关于测试实用程序的想法。在用户第一次运行应用程序之前,让他们运行“加载库”测试实用程序以检查任何明显的问题。如果该应用程序向他们提供错误消息,那么他们可以运行“DLL-finder”实用程序并将结果发送给您。这种方法让客户觉得您有一种既定的方法来处理兼容性问题。我一直讨厌让最终用户执行这样的测试,这些测试应该在软件发布之前运行,但考虑到您的限制,我认为您没有太多选择。 这是一个很棒的解决方案。我想我会写一个小的 Python 脚本来做到这一点。另一方面,Microsoft 库是一个真正的难题。在一台机器上,他们将“msjava.dll”列为缺少的依赖项,但我的 64 位机器缺少这个 DLL。 我相信msjava.dll
不再在 Windows 机器上,因为几年前 MS/Sun Java 和解。 DependencyWalker 常见问题解答讨论了一些关于msjava.dll
(只是可能对您感兴趣/有帮助的技术问题):dependencywalker.com/faq.html
@wheaties:如果您的应用程序和/或工具是可能在 Win64 机器上运行的 32 位进程,您还应该注意处理(或至少注意)SysWOW64 重定向问题。
+1 提到Dependency Walker,就是这些特殊问题的第一道防线。【参考方案5】:
以这种方式呈现给你的老板: 一台用于测试安装的机器比生气的客户要便宜得多,甚至比您追踪问题的时间要便宜得多。
【讨论】:
可信度 = 更多销量。【参考方案6】:是否可以改为静态链接您的一些依赖项?
【讨论】:
我希望。这些是 Microsoft DLL,它们是 Windows 的一部分。你知道静态链接这些的方法吗?如果你这样做,那将为我节省大量的精力。 如果这些 DLL 是 Windows 的一部分,它们怎么会丢失?如果它们是其他 Microsoft DLL(msvcrt、mfc...等),那么您应该静态链接它们。使您免于安装问题和版本验证。【参考方案7】:您的安装中是否包含特定的 DLL?
如果是这样,这是错误的做法。相反,您应该为您的编译器包含 MS 可再发行包。例如,如果您使用 MSVC 8.0 SP1 进行编译,您将获得此包并将其与您的应用程序一起安装:
Microsoft Visual C++ 2008 SP1 Redistributable Package (x86)
每个MSCV 版本(包括SP 级别)都有自己的redist 包。确保为您的编译器选择正确的。
灭火后,与你的老板坐下来说服他们,如果你要伪装成一家软件公司,就必须表现得像一个软件公司。获得真实的生产环境。这不是高中编程俱乐部,而是你的生计。
编辑:只是为了清楚。一旦你得到了 redist,不要把它解压到你的机器上,然后在你的设置中包含封装的 DLL。相反,包括整个 redist 安装程序作为安装的子步骤。先安装 redist,然后安装你的代码。
【讨论】:
我发送整个可再发行的 exe。我不解压并自己发送 dll。是的,我有正确的 C++ redist 包。 @wheaties:你的 dll 是否与 redist dll 冲突?还是其他dll?【参考方案8】:仅供审查:你有这个可再分发的包吗? http://www.microsoft.com/downloads/details.aspx?familyid=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=en
这对我有帮助。
【讨论】:
我使用的是 VS2005,而不是 2008。我希望我使用的是更新的 VS,但除非合同规定,否则他们不会花钱。顺便说一句,欢迎来到 SO 并感谢您的贡献。【参考方案9】:您可以要求客户提供 *** 访问权限或类似的东西,以便您可以使用他们的环境。
【讨论】:
问题是他们正在安装这些应用程序的某些计算机已脱网并且必须保持脱网。【参考方案10】:如果您将完整的绝对路径传递给LoadLibrary()
,它只会在该确切位置查找 DLL。您也许可以使用它来解决您的一些问题。将您的应用所需的所有 DLL 打包到“lib”文件夹中,并将其与您的程序一起包含在 zip 文件中。只要“lib”文件夹与 .exe 位于同一文件夹中,您就可以使用 GetCurrentDirectory
构建这些库的绝对路径,并确保正在加载的库与您在测试时使用的库相同软件。但是,如果您使用的是您无权重新分发的库,则此方法不是很有帮助。
【讨论】:
【参考方案11】:我会检查 VMWare。这是一个非常酷的虚拟机,您可能可以模仿客户的环境。
另外,我想和你的老板谈谈。他们完全有可能假设您运送的产品已经过您的彻底测试。所以这可能是一个错误的沟通,我会和他谈谈只是为了确定。如果你的老板没有理解你的观点,我绝对会考虑辞职,因为他会声称只要产品成功,他就必须“与你交谈”并“让你直截了当”。完全有可能在你的评论中,他会说你不合作或最糟糕。所以我最好是谈谈,然后根据你是否应该继续留在公司做出决定。
【讨论】:
【参考方案12】:您确定您正在开发的 Windows 的版本和服务包与客户的机器“相似”吗?如果没有,请尝试。有时不同的 SP 是游戏的罪魁祸首。
您可以按照所有人的建议使用 VM,或者您可以拥有 (Norton) 各种版本和 SP 的 Ghost 映像,但您的企业必须再次承担机器成本。
【讨论】:
以上是关于客户愤怒,与未知的 DLL 依赖作斗争的主要内容,如果未能解决你的问题,请参考以下文章