.net - Windows 7 和 8 中的不同 .NET 4.5?

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

我在装有 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 8 也有自定义版本的 .NET 3.5。没什么不寻常的,.NET Framework 确实对操作系统版本有很大的依赖性。以及它预装在 Windows 8 上的原因。

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

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

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

关于.net - Windows 7 和 8 中的不同 .NET 4.5?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19705302/

相关文章:

.net - .NET 中的 CaSTLe、AOP 和日志记录

asp.net-mvc - 命名空间更改 - 发现多个类型与名为 'Home' 的 Controller 匹配

wpf - 将 WPF 网格控件数据绑定(bind)到 CSV 文件

c# - 未安装 .NET 4.5.2 的目标包

c# - EF5 收到此错误消息 : Model compatibility cannot be checked because the database does not contain model metadata

c# - 如何从 if 语句中的 bool 值中跳出 if 语句

c# - Windows Azure 网站中的发布历史记录

c# - 使用 Visual Studio 2010 编译时,覆盖泛型迭代器会导致 BadImageFormatException

c# - .NET 4.5 HttpClient 请求 ServicePoint

c# - 具有超过 65535^2 个元素的二维数组 --> 数组维度超出支持范围