在 Python.net 应用程序中安装自定义 IMessageFilter 时出现段错误

Segfault when installing custom IMessageFilter in Python.net app

我正在尝试使用 Python.net 在 Winforms 应用程序中添加自定义 IMessageFilter,但出现段错误。

这是一个最小的示例应用程序:

import clr
clr.AddReference("System.Windows.Forms")
import System.Windows.Forms as WinForms


class MessageFilter(WinForms.IMessageFilter):
    __namespace__ = 'System.Windows.Forms'

    def PreFilterMessage(self, message):
        print('filter', message)
        return False


class HelloApp(WinForms.Form):
    def __init__(self):
        self.textbox = WinForms.TextBox()
        self.textbox.Text = "Hello World"
        self.Controls.Add(self.textbox)


def main():
    form = HelloApp()
    app = WinForms.Application
    f = MessageFilter()
    app.AddMessageFilter(f)
    app.Run(form)


if __name__ == '__main__':
    main()

如果您 运行 显示此代码,应用程序 window 会显示,但您会立即收到段错误(我假设这是第一条消息传递到过滤器时)。段错误是完全不透明的。没有堆栈跟踪或其他有用的详细信息 - 它只是 OS 级别的段错误处理程序。

如果注释掉第 25 行(app.AddMessageFilter(f),安装实际的过滤器),代码工作正常。

如果您修改 MessageFilter 使其不子类化 Winforms.IMessageFilter,您会收到一条错误消息,指出没有 AddMessageFilter 方法匹配给定的参数。

如果您重命名或删除 PreFilterMessage() 方法,您会收到一个错误,指出 Python 对象没有 PreFilterMessage 方法。

关于我做错了什么的任何建议,and/or如何解决?或者如何获得更多可以指向段错误源的调试信息?

这似乎是 Python.net 本身的错误,与编组 byref 参数的问题有关。详情可见here.