相关疑难解决方法(0)

获取组件的父表单

我有一个非可视组件来管理其他视觉控件.

我需要引用组件正在运行的表单,但我不知道如何获取它.

我不确定添加一个构造函数与父指定为控件,因为我希望组件只是被放入设计器中工作.

另一个想法是让父母的财产作为控制,默认值为'我'

任何建议都会很棒

编辑:

为了澄清,这是一个组件,而不是一个控件,请参见此处:ComponentModel.Component

c# vb.net components winforms

25
推荐指数
2
解决办法
4万
查看次数

将委托定义为函数指针

我正在使用一个调用非托管函数指针的委托.这会导致垃圾收集器在使用之前收集它,如MSDN上的CallbackOnCollectedDelegate MDA页面中所述:CallbackOnCollectedDelegate MDA的MSDN页面.

该决议声明我必须将适当的委托编组为非托管函数指针.我最初的反应是使用:

[MarshalAs(UnmanagedType.FunctionPtr)]
public delegate void EntityCallback([MarshalAs(UnmanagedType.SysInt)] IntPtr entity);
Run Code Online (Sandbox Code Playgroud)

但是,C#编译器不会让我编组委托,即使这是MSDN建议的解决方案.此外,MSDN页面仅显示抛出问题的示例,但不是解决方案之一.

我如何作为非托管函数指针封送我的委托或阻止它被GCed?

编辑:根据建议,我创建了回调的引用.因此,我的代码从/更改为:

// From:
foo.SetCallback(new EntityCallback(bar));

// To:
call = new EntityCallback(bar); // Referenced in class
foo.SetCallback(call);
Run Code Online (Sandbox Code Playgroud)

现在这确实有效 - 但仅在调试模式下.当我切换到Release时,它会在同一点崩溃.这是为什么?

编辑2:更完整的代码片段:

public class Test
{
    private EntityCallback Call;

    private void Bar(System.IntPtr target)
    {
        ...
    }

    public Entity Foo { get; set; }

    public Test()
    {
        this.Foo = new Body.Sphere() { Visible = false }; // Irrelevant
        this.Foo.CollisionType = 3; // Irrelevant

        this.Call = new …
Run Code Online (Sandbox Code Playgroud)

c# delegates unmanaged function-pointers

5
推荐指数
1
解决办法
3844
查看次数