我在装有 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/