诊断 Interop 调用在 C# 桌面应用程序上挂起 - 仅适用于某些用户
Diagnosing Interop call hang on C# desktop app - only for some users
我们有一个 C# 桌面应用程序 (Windows 10 x64) 在启动时挂起 我们的一小部分用户。这个我没见过,本地也无法复现。
我们的应用程序使用我们的 C#(托管)库,其中包括对我们的 C(本机)DLL 的一些互操作调用。
通过检测特殊构建和用户的慷慨帮助,我已经能够确定:
- 我们的托管库加载正常;我可以从我们的 EXE 访问 类 和静态成员。
- 该库包含我们本机 DLL 中一堆 API 的互操作包装器,一旦调用其中一个,应用程序就会挂起。
这只会对少数用户失败,同样的代码已经过测试和调试,并且对成千上万的用户运行良好。
- 我已将第一个失败的 Interop 调用替换为不带参数且 returns 常量 int 值的调用 - 仍然冻结。
- 我在我们的 DLL 上 运行 DEPENDS.EXE 并确保我们 shipping/installing 所有必要的 DLL 依赖项。
- 我有受影响的用户 运行 Visual C++ Redistributable Installer -- 没有改进
- 上面列出的各种原因通常会导致应用程序退出,但此应用程序挂起时没有任何消息框或其他 UI。
任何人都可以提供有关如何远程诊断的建议吗?
这原来是一个特定的第 3 方 DLL 在加载时挂起(CRT 启动或 DLL 主)。我们对 DLL 依赖项的版本、DLL 搜索路径等做了很多检查。但我们从未确切地弄清楚问题是什么;只有一个特定的 DLL(在我们的系统上加载良好)会锁定我们用户系统的一小部分。
解决方案是获取更新版本的 DLL。这组特定的第 3 方库是使用非 Microsoft 工具构建的,因此它们的编译器或链接器中可能存在一些细微的错误。
我们有一个 C# 桌面应用程序 (Windows 10 x64) 在启动时挂起 我们的一小部分用户。这个我没见过,本地也无法复现。
我们的应用程序使用我们的 C#(托管)库,其中包括对我们的 C(本机)DLL 的一些互操作调用。 通过检测特殊构建和用户的慷慨帮助,我已经能够确定:
- 我们的托管库加载正常;我可以从我们的 EXE 访问 类 和静态成员。
- 该库包含我们本机 DLL 中一堆 API 的互操作包装器,一旦调用其中一个,应用程序就会挂起。
这只会对少数用户失败,同样的代码已经过测试和调试,并且对成千上万的用户运行良好。
- 我已将第一个失败的 Interop 调用替换为不带参数且 returns 常量 int 值的调用 - 仍然冻结。
- 我在我们的 DLL 上 运行 DEPENDS.EXE 并确保我们 shipping/installing 所有必要的 DLL 依赖项。
- 我有受影响的用户 运行 Visual C++ Redistributable Installer -- 没有改进
- 上面列出的各种原因通常会导致应用程序退出,但此应用程序挂起时没有任何消息框或其他 UI。
任何人都可以提供有关如何远程诊断的建议吗?
这原来是一个特定的第 3 方 DLL 在加载时挂起(CRT 启动或 DLL 主)。我们对 DLL 依赖项的版本、DLL 搜索路径等做了很多检查。但我们从未确切地弄清楚问题是什么;只有一个特定的 DLL(在我们的系统上加载良好)会锁定我们用户系统的一小部分。
解决方案是获取更新版本的 DLL。这组特定的第 3 方库是使用非 Microsoft 工具构建的,因此它们的编译器或链接器中可能存在一些细微的错误。