【问题标题】:Migrating C++CLI wrapper from .NET 4.0 to 4.5 cause winsock error on Windows Server 2012 R2将 C++CLI 包装器从 .NET 4.0 迁移到 4.5 会导致 Windows Server 2012 R2 上出现 winsock 错误
【发布时间】:2015-08-21 11:37:49
【问题描述】:

我已经为我们使用的通信中间件构建了一个 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 与 4.5.x 有线连接?

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

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

【问题讨论】:

    标签: c++-cli .net-4.5 winsock windows-server-2012-r2 migrating


    【解决方案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(地址空间布局随机化)有关,这是一种针对恶意软件的对策。通过随机化地址空间布局,恶意软件很难攻击代码,它不再依赖此类代码存在于已知地址。

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-29
        • 1970-01-01
        相关资源
        最近更新 更多