【问题标题】:Different .NET 4.5 in windows 7 & 8?Windows 7 和 8 中的不同 .NET 4.5?
【发布时间】:2013-11-11 09:17:28
【问题描述】:

我用 Visual Studio 2012 在 windows 7 机器上编写了一个 .NET 4.5 应用程序,它在 windows 7 上安装和运行良好。

当我尝试在 Windows 8 机器上部署它时,它发生了灾难性的崩溃,事件查看器中的输出不是很有用。
Dependency walker 的跟踪表明它在一个/一些核心 Windows dll 中找不到方法。 例如:

LoadLibraryExW("C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscoreei.dll", 0x0000000000000000, LOAD_WITH_ALTERED_SEARCH_PATH) returned 0x00007FFDEA780000.  
GetProcAddress(0x00007FFDEA780000 [MSCOREEI.DLL], "RegisterShimImplCallback") called from "MSCOREE.DLL" at address 0x00007FFDEA82F3A9 and returned 0x00007FFDEA783444.  
GetProcAddress(0x00007FFDEA780000 [MSCOREEI.DLL], "RegisterShimImplCleanupCallback") called from "MSCOREE.DLL" at address 0x00007FFDEA82F3BC and returned NULL. Error: The specified procedure could not be found (127).

在检查 mscoreei.dll 时,我注意到:

Windows 7 机器
v4.0.30319.18408
613,456 字节

Windows 8 机器
v4.0.30319.33440
633,424 字节

两台机器(根据ASoft .NET version detector)都有.NET 4.5 Full。

为什么我的机器有不同的 .NET 版本,我如何确保我的 windows 7 机器上的编译器针对 windows 8 机器的正确版本?

【问题讨论】:

  • 猜测 - 服务包/安全补丁。也许运行 Windows 更新?
  • @Bridge:我已经在这两个平台上运行了一百万次 Windows 更新。
  • 我看到你已经标记了 Windows 8.1,它带有 .net 4.5.1,但是在带有 .net 4.5.0 的 Windows 7 上使用 Visual Studio 2012,这就是版本号的原因是不同的。不知道为什么它会灾难性地失败!
  • @JMK:我已经在我的 Windows 7 机器上安装了 4.5.1,以防万一。
  • 奇怪,it looks like LOAD_WITH_ALTERED_SEARCH_PATH 在 Windows 7 上已被弃用,也许它在 Windows 8.1 上根本不存在?

标签: .net visual-studio-2012 .net-4.5 windows-8.1


【解决方案1】:

看起来,无论是在您的代码中还是在第三方 DLL 中,都在使用 LOAD_WITH_ALTERED_SEARCH_PATH 值。

这是因为 LoadLibraryEx 函数在某处被调用。这会导入 kernel32.dll which is different in Windows 7 compared to Windows 8

错误was already deprecated in Windows 7中提到的LOAD_WITH_ALTERED_SEARCH_PATH,可能是Windows 8中根本不存在。

我认为您需要在 Windows 8.1 上安装 Visual Studio,并从那里调试您的代码,直到遇到异常。它可能会帮助您查明问题在哪里比在 7 上编译并尝试在 8 上运行同时尝试破译神秘的错误消息更快。找到问题库后,您可以联系供应商以查看他们是否有更新版本。

【讨论】:

  • 在 8.1 上尝试调试的好建议。不幸的是,它使用完全相同的项目文件和源代码完美地编译和运行......
  • 完全没有错误。没问题。代码是一样的(是8.1机器7机器硬盘上编译的)。该项目现在面向 .NET 4.5。
【解决方案2】:

是的,这是完全正常的。 Windows 8 还具有 .NET 3.5 的自定义版本。没有什么不寻常的,.NET Framework 确实严重依赖操作系统版本。以及它预装在 Windows 8 上的原因。

对于 MSCoree(.NET 框架的“加载程序 shim”)而言,这种依赖关系尤其值得注意。它带来了一个非常戏剧化的特技,它可以让 Windows 从 32 位 EXE 文件创建一个 64 位进程。这并不简单,它与 Windows 中的加载程序密切合作以实现这一点,修补内部数据结构以使其创建 64 位进程。

看到“找不到指定的程序”错误也没什么异常。这就是它使用 GetProcAddress() 而不是隐式导入依赖的原因。使用 GetProcAddress() 是一种非常常见的技术,可以确定是否确实支持特定的 api 函数。

我严重怀疑您是否找到了程序崩溃的真正原因。千万不要忘记实现 AppDomain.CurrentDomain.UnhandledException 事件来报告未处理的异常,你从 Windows 获得的崩溃信息是毫无用处的。

【讨论】:

    【解决方案3】:

    这不是一个特别有用的答案 - 但它是一个无法处理在 Win 8 上的 x64 进程中运行的第三方 dll。 没有更多关于究竟是什么导致实际问题的信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多