.NET 运行时错误 80131506 - 将 Lambda 传递给本机函数

2024-02-15

所以我收到这个错误,看起来好像是一个损坏的垃圾收集:

应用程序因“.NET 运行时内部错误”而崩溃 https://stackoverflow.com/questions/4367664/application-crashes-with-internal-error-in-the-net-runtime

完整的错误是:

由于 IP 71C571C8 (71B20000) 处的 .NET 运行时出现内部错误,该进程被终止,退出代码为 80131506。

它运行于:

框架版本:v4.0.30319

重复运行此函数时会出现不一致的情况:

        public static int GetMdiTitledChildWindows(IntPtr parentWindow)
        {
            IntPtr mdiClient = FindWindowEx(parentWindow, IntPtr.Zero, MdiClient, "");
            List<IntPtr> handles = new List<IntPtr>();
            EnumChildWindows(mdiClient, (hwnd, param) =>
            {
                handles.Add(hwnd);
                return true;
            }, IntPtr.Zero);
            int counter = 0;
            foreach (IntPtr handle in handles)
            {
                StringBuilder builder = new StringBuilder();
                GetWindowText(handle, builder, GetWindowTextLength(handle)+1);
                if (builder.Length > 0)
                {
                    counter++;
                }
            }
            return counter;
        }

Where FindWindowEx(), EnumChildWindows() and GetWindowText()所有 p/invoke 签名的定义都与此类似:

[DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);

该错误似乎仅在我多次运行该方法后才会发生,但是,这种情况并不会始终发生。有时有效,有时无效。

对于如何解决这个问题,有任何的建议吗?


因此,我在 Discord 上一位慷慨捐助者的帮助下解决了我的问题。

问题是我将 lambda 作为委托传递给 p/invoke:

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);

所以每次非托管 WinAPI调用回调到我的委托中,GC 有机会运行,如果运行的话,它会收集我的 lambda 导致这次崩溃。这不一定会发生,这就是为什么我的方法大部分时间都有效并且崩溃的原因不一致。

解决方案是添加对 lambda 的引用,以防止 GC 收集它(尽管我全力以赴并将其设为本地函数,因为皮带和大括号):

        public static int GetMdiTitledChildWindows(IntPtr parentWindow)
        {
            IntPtr mdiClient = FindWindowEx(parentWindow, IntPtr.Zero, MdiClient, "");
            List<IntPtr> handles = new List<IntPtr>();
            bool addToList(IntPtr hwnd, IntPtr param)
            {
                handles.Add(hwnd);
                return true;
            }
            EnumWindowsProc gcHolder = addToList;
            EnumChildWindows(mdiClient, gcHolder, IntPtr.Zero);
            int counter = 0;
            foreach (IntPtr handle in handles)
            {
                int textLength = GetWindowTextLength(handle) + 1;
                StringBuilder builder = new StringBuilder(textLength);
                GetWindowText(handle, builder, textLength);
                if (builder.Length > 0)
                {
                    counter++;
                }
            }
            return counter;
        }

该应用程序现在可以按预期工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET 运行时错误 80131506 - 将 Lambda 传递给本机函数 的相关文章

  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • AES 输出是否小于输入?

    我想加密一个字符串并将其嵌入到 URL 中 因此我想确保加密的输出不大于输入 AES 是可行的方法吗 不可能创建任何始终会创建比输入更小的输出的算法 但可以将任何输出反转回输入 如果您允许 不大于输入 那么基本上您只是在谈论同构算法alwa
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 使用restsharp序列化对象并将其传递给WebApi而不是序列化列表

    我有一个看起来像的视图模型 public class StoreItemViewModel public Guid ItemId get set public List
  • cout 和字符串连接

    我刚刚复习了我的 C 我尝试这样做 include
  • 了解使用 Windows 本机 WPF 客户端进行 ADFS 登录

    我已经阅读了大量有关 ADFS 与 NodeJS Angular 或其他前端 Web 框架集成以及一般流程如何工作的文献 并通过 Auth0 Angular 起始代码构建了概念证明 但我不明白如何这可以与本机 WPF Windows 应用程
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • C++0x中disable_if在哪里?

    Boost 两者都有enable if and disable if 但 C 0x 似乎缺少后者 为什么它被排除在外 C 0x 中是否有元编程工具允许我构建disable if按照enable if 哦 我刚刚注意到std enable i

随机推荐

  • 如何强制 IntelliJ 使用 Maven 下载 javadocs?

    我对项目结构中的一些 Maven 条目有以下描述 文件系统中确实不存在 Javadoc 文件 同时 它存在于中央存储库中 为什么没有下载 如何强制下载 UPDATE 这些选项已经开启 设置后尝试重新编译 关闭 打开等 单击IntelliJ右
  • ARM 皮质:使用位带的互斥体

    鉴于此 在 ARM Cortex M3 上 我可以 原子地读取一位 原子地设置一位 原子地清除一位 如何将这些组合起来形成互斥体样式的操作集 try lock take lock release lock 看起来try lock or ta
  • python 中使用 pandas dataframe 和 statsmodels 或 scipy 进行方差分析?

    我想使用 Pandas 数据框来分解一个变量的方差 例如 如果我有一个名为 度 的列 并且我已针对各种日期 城市以及夜间与白天对其进行了索引 那么我想找出该系列中的变化中有多少部分来自横截面城市变化 有多少来自时间序列变化 有多少来自夜间与
  • CSS:#id .class VS .class 性能。哪个更好?

    我认为这会更快 dialog videoContainer width 100px than videoContainer width 100px 当然不考虑这一点 videoContainer在第一个示例中 只会在以下样式下设置样式 di
  • 非空终止字符数组

    include
  • 使用带有导航器的滑动菜单的 Onsen-UI

    好的 问题是我有一个带页面的工作滑动菜单 现在我的一个页面有一个 ons list 通过单击ons list item 我想导航到带有后退按钮的新页面 我到处搜索但没有找到解决我的问题的任何正确方法 这是我的代码
  • 在集合视图中显示两个不同的单元格 - Swift 2.0 iOS

    我正在开发一个 交易 应用程序 我希望拥有静态数量的单元格 加载时 用户将看到 5 个单元格 每个单元格都显示一个标有 添加 的标签 当添加 玩家 时 该单元格显示玩家信息 其他 4 个单元格仍然显示 添加 标签 另一个是添加的 2个单元格
  • 从node js到django的csrf问题

    我想将 csrftoken 从 node js 传递到 django 我的 server js 中有这段代码 socket on unread global function data var values querystring stri
  • LINQ to SQL 谓词生成器

    我使用 PredicateBuilder 如下所示http www albahari com nutshell predicatebuilder aspx http www albahari com nutshell predicatebu
  • Python Selenium 打印文本字段的值显示为空。该值未打印

    我正在尝试将文本字段的值打印到控制台 该网页的文本字段中的值为 1 000 000 1 000 000 应该打印 但我的方法是打印空白 我正在使用 Python Webdriver 我正在使用 text 它应该获取文本字段的文本值 我的方法
  • 初始化并声明为“extern”,为什么我看到下面的警告? [复制]

    这个问题在这里已经有答案了 为什么我会看到以下警告 警告 i 已初始化并声明为 extern include
  • 使用 renderUI 在 ShinyR 中创建选项卡时如何在不同对象中重用数据集

    我开发了一个闪亮的应用程序 在不同的选项卡下包含几个绘图和数据 选项卡是使用另一个参数动态创建的 但每次我都必须对数据进行子集化以准备绘图 假设使用 mpg 子集数据 我在 mpg 选项卡中绘制了两种不同类型的图表 并且我不想在绘制绘图时每
  • 在美味派视图中暴露“虚拟”字段?

    我想使用 tastypie 创建一个视图来公开相同类型的某些对象 但具有以下 two 三个变化 我需要使用三个单独的查询来获取对象 我需要添加一个底层模型中不存在的字段 该字段的值取决于它来自哪个查询 和 数据将是每个用户的 因此我需要连接
  • wix 在 Windows XP 上安装期间使用了不正确的字体

    在基本安装模式 msiexe i MyInstaller msi qb 期间 我在 MSI 进度对话框中看到的是方框而不是字符 有没有办法更改 基本 MSI 对话框中使用的字体 TTF FontFace 1 微星日志 MSI c A4 EC
  • Pandas 相当于 SQL 中的 GROUP BY HAVING

    在 pandas 中使用 groupby 并并行应用过滤器的最有效方法是什么 基本上我要求 SQL 中的等效项 select group by col name having condition 我认为有很多用例 包括条件均值 总和 条件概
  • Keras 中输入数据的标准化

    深度学习中的一项常见任务是将输入样本标准化为零均值和单位方差 人们可以使用如下代码 手动 执行规范化 mean np mean X axis 0 std np std X axis 0 X x mean std for x in X 然而
  • 如何调整现有 pdf 页面大小 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在应用程序中 用户可以上传任何尺寸为 8 46 x 10 97 的 pdf 文件 根据我们的应用尺寸应为 8 5 x 11 问题是 如何重
  • 在 Google 可视化折线图中创建可点击元素

    是否可以将 onclick 方法附加到 Google 可视化折线图中的元素 例如 如果用户单击图表中的点 我想将用户发送到包含更多详细信息的页面 我已经浏览了所有文档 但找不到如何执行此操作的示例 我看到有一些事件方法 来自文档 http
  • 如何防止将转义序列添加到 PowerShell 输出中?

    我没想到或不希望输出中出现转义序列 第一行输出是 00000000000000001B 5B 33 32 3B 31 6D4C 6F 63 61 6C 41 64 64 72 32 1m本地地址 PS C src t gt Get NetT
  • .NET 运行时错误 80131506 - 将 Lambda 传递给本机函数

    所以我收到这个错误 看起来好像是一个损坏的垃圾收集 应用程序因 NET 运行时内部错误 而崩溃 https stackoverflow com questions 4367664 application crashes with inter