1

我为我们使用的通信中间件构建了一个 C++ CLI 包装器。包装器已在 .NET 4.5 中,并且在 Windows 7 和 Windows Server 2008 R2 中运行良好。但在 Windows Server 2012 R2 中,它会因 mswsock.dll 中的“访问冲突”错误而崩溃

有趣的是,如果我构建包装器并测试应用程序以 .NET 4.0 为目标,它就可以工作。但是当我将它们重新定位到 .NET 4.5.x 时,它会触发异常。

我试图调查安全性、强命名、热修复 .NET,但没有用。

令我困扰的是它适用于 .NET 4.0 中的 Server 2012 R2,但不适用于 4.5.x。显然,当本机代码访问 winsock API 时,就会发生访问冲突。

有没有人遇到过同样的问题,或者类似的 Server 2012 .NET 4.0 vs 4.5.x 有线?

运行 .NET 4.5 应用程序时是否在 Server 2012 中激活了任何对 4.0 应用程序无效的安全机制。特别是关于 CLI 模块?

技术:本机代码是使用 VS2010 编译的,因此包装器是使用 VS2012 中的编译器编译的。编辑 C++ CLI 项目文件以设置所需的框架目标。测试应用程序是用 C# 编写的。

4

2 回答 2

1

所以我们最终发现了这个错误。第三方通信中间件在 64 位版本中存在 bug。一个指针被强制转换为 long 并再次返回,导致 64 位寻址错误。

为什么这是在使用 .NET 4.5 时首先引起的,我不知道。我似乎带有 .NET 4.5 的 Server 2012 R2 总是在 32 位地址范围之外分配内存。至少在我们的测试平台上。它总是得到这个访问冲突错误。

于 2015-09-07T08:03:04.910 回答
1

带有 .NET 4.5 的 Server 2012 R2 始终在 32 位地址范围之外分配内存

是的,当您在 EXE 文件上使用 Dumpbin.exe /headers 时,这非常明显。我将发布它显示的输出的相关部分:

        4.00 operating system version
        0.00 image version
        6.00 subsystem version                      // <== here
           0 Win32 version
        8000 size of image
         200 size of headers
           0 checksum
           3 subsystem (Windows CUI)
        8560 DLL characteristics
               High Entropy Virtual Addresses       // <=== here
               Dynamic base
               NX compatible
               No structured exception handler
               Terminal Server Aware

子系统版本是 .NET 4.5 编译的可执行文件中的第一个重要变化。6.00 版是 Vista 的版本,之前设置为 4.00。一个副作用是程序无法再在 XP 和 Server 2003 上运行。版本 6 是对 Windows 内核的最后一次彻底改革。巨大的变化,让 Vista 如此不受欢迎的那种。

High Entropy Virtual Addresses特征是重要的变化。这就是导致本机代码中的错误发生故障的原因。此选项与 ASLR(地址空间布局随机化)有关,这是一种针对恶意软件的对策。通过随机化地址空间布局,恶意软件很难攻击代码,它不能再依赖此类代码存在于已知地址。

由选项启用的 ASLR 的原始版本Dynamic base通过选择 256 个可能的地址偏移之一来随机化地址。在启动时选择。64 位进程有更好的选择,它有更大的地址空间。/HIGHENTROPYVA 链接器选项启用它。但副作用是地址不再可能位于较低的 4 GB 地址空间中。从而触发了铸造错误。

当您面向 4.5 及更高版本时,.NET 4.5 编译器会打开这些,而 4.0 编译器则不会。不再需要支持 XP 和 Server 2003(它们无法运行 4.5)启用了这些选项。

于 2015-09-07T10:40:24.763 回答