使用 FreeSwitch Embedded,出现堆损坏错误。没有针对 Framework 4.0 的错误,所有更高版本的 Framework 都会发生

Using FreeSwitch Embedded, getting heap corruption error. No error targeting Framework 4.0, does happen with all later Framework

我有针对 .NET Framework 4.0 的代码,它不再受 MS 支持。您甚至无法将 .NET Framework 4.0 SDK 安装到最新版本的 Visual Studio。我正在尝试更新到更高版本的框架,最好是 4.7.2 以获得最广泛的兼容性,但 4.6.1 是可以接受的,因为我至少可以在我的 IDE 中使用 SDK。代码编译没有任何错误。 64 位将是一个不错的奖励,但不是必需的。

第一次调用初始化 FreeSWITCH.Managed.dll 时发生错误,如下所述:

FreeSwitch embedded

相关代码在这里:

            string err = "";
            const uint flags = (uint)(switch_core_flag_enum_t.SCF_USE_SQL | switch_core_flag_enum_t.SCF_USE_AUTO_NAT);
            freeswitch.switch_core_set_globals();
            try
            {
                freeswitch.switch_core_init(flags, switch_bool_t.SWITCH_FALSE, ref err);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Exception in switch_core_init "+ex.ToString());
            }

程序在freeswitch.switch_core_init处立即崩溃,没有JIT错误框。有一个选项可以在测试机上调试,那里显示的错误是堆损坏错误。大概在错误的字符串上。

我在这个帖子上看到:

Prior post on subject

有些人已经解决了这个问题,但是他们没有post他们是如何解决的,我在这里有点不知所措。我已经尝试为字符串初始化一个值,包括使其空格大小为 5 亿个字符,但无济于事。

实际上现在可以正常工作了。

答案相当直接,我将 DLL 更新到 FreeSwitch 的最新版本,而不是尝试使用旧的 .NET 4.0 代码一直使用的相同古老版本。

较新的 DLL 只会 运行 为 64 位,而旧的 DLL 只会 运行 为 32 位。因此,为任何 32 位用户保留旧程序的存档副本是必要的,但现在终于可以开始实际更新代码了。

有一个 MSI 安装程序,其中包含从 FreeSwitch 网页链接的所有更新库,用于 Windows 安装。

FreeSwitch Windows Install Page

请注意:使用更新的 DLL,调用 FreeSwitch 库的所有 ref 关键字都需要更改为 out 关键字。