0

在我的最后一个问题中,我询问了有关在 C++-cli 程序中运行 C# 表单的问题。我得到了它的工作,但我遇到了问题。我会尽量简短。

我的 C++ 程序必须执行一个 C# 表单并在其中执行一些简单的功能(增加计数器并显示它们)。但是我不知道最好的方法来做到这一点。我在 init 函数中初始化了表单:

C++-cli

SUTAdapter::Form1^ *ptForm1; // Global variable

...

FormProject::Form1^ form1;
form1 = gcnew FormProject::Form1();
ptForm1 = &form1;
(*ptForm1)->Show();
(*ptForm1)->incCounter(0);

C++ 程序中的一些其他函数只是调用incCounter。我的问题是,从另一个函数对 incCounter 的第二次调用使我的 C# Form1 为空(this == null),因此我可以使用 incCounter 的函数代码,但不能使用类变量。很奇怪,好像程序处理了FormProject。

C#

public void incCounter(int counter)
{
  int param1 = counter;
  this.count[counter]++; // this == null in sucessive calls from c++ program
}

我究竟做错了什么?我实际上已经禁用了表单,只使用了函数和变量,以防问题出在 UI 上(调用等)。退出 C++ 初始化函数(第一块代码)是否清除 Form1?

4

3 回答 3

1

如果您必须获取托管堆上的 .NET 对象的地址,请将其放入pin_ptr<>以便 GC 不会移动它。这可能是你问题的根源。

于 2009-02-25T00:36:49.897 回答
0

I think you should just be storing the handle in a global (i.e. static) object, or at least a static field of a convenient class to use. Like danbystrom said, keeping a pointer to the Form reference will not prevent the garbage collector from reclaiming the form once the original handle goes null.

static ref class Globals
{
    static FormProject::Form1^ MyForm;
}

// Later on...
Globals::MyForm = form1;
form1->DoStuff();
form1 = nullptr;

// Globals::MyForms still exists!

Though I suspect the Form reference going null means something else is wrong too.

于 2009-02-24T14:33:59.923 回答
0

我的猜测是 *ptForm1 不足以让 CLR 将其视为参考。也许它应该是 Form1^^ ptForm,而不是?或者你为什么不把 form1 变量作为你全局插入的指针?

于 2009-02-24T10:45:42.903 回答