我有一个非可视组件来管理其他视觉控件.
我需要引用组件正在运行的表单,但我不知道如何获取它.
我不确定添加一个构造函数与父指定为控件,因为我希望组件只是被放入设计器中工作.
另一个想法是让父母的财产作为控制,默认值为'我'
任何建议都会很棒
编辑:
为了澄清,这是一个组件,而不是一个控件,请参见此处:ComponentModel.Component
我正在使用一个调用非托管函数指针的委托.这会导致垃圾收集器在使用之前收集它,如MSDN上的CallbackOnCollectedDelegate MDA页面中所述:CallbackOnCollectedDelegate MDA的MSDN页面.
该决议声明我必须将适当的委托编组为非托管函数指针.我最初的反应是使用:
[MarshalAs(UnmanagedType.FunctionPtr)]
public delegate void EntityCallback([MarshalAs(UnmanagedType.SysInt)] IntPtr entity);
但是,C#编译器不会让我编组委托,即使这是MSDN建议的解决方案.此外,MSDN页面仅显示抛出问题的示例,但不是解决方案之一.
我如何作为非托管函数指针封送我的委托或阻止它被GCed?
编辑:根据建议,我创建了回调的引用.因此,我的代码从/更改为:
// From:
foo.SetCallback(new EntityCallback(bar));
// To:
call = new EntityCallback(bar); // Referenced in class
foo.SetCallback(call);
现在这确实有效 - 但仅在调试模式下.当我切换到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 …