0

我正在尝试在 C++-CLI 项目中使用 C# 类,但 Visual Studio 只允许我在函数内部声明本地范围内的 C# 对象的句柄 (^)。我让它工作的唯一方法是声明一个指向句柄的全局指针:

SUTAdapter::Form1^ *ptForm1;

但是,如果我在函数内部创建一个对象并将其地址提供给全局指针:

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

当函数退出并且我尝试在其他一些 C++-CLI 函数中使用 incCounter 函数时,该对象似乎消失了(调试器说 this == null)。有没有办法在 C++-CLI 中拥有 C# 代码的全局句柄?我猜出于某种我不明白的原因禁止全局句柄,但我没有想法,我需要这样做。谢谢你。

编辑:

*ptForm1 = gcnew SUTAdapter::Form1();

给出空引用异常。为什么?

4

5 回答 5

4

这种限制似乎与其他基于 CLR 的语言一致。例如,C# 没有静态的、函数范围的变量的概念。C++/CLI 中缺少此类功能表明这就是 CLR 的工作方式 - 静态对象必须在类范围内定义。

CLR 是基于对象的,所以这只是面向对象的特性影响在其上运行的语言设计的一个例子。

从面向对象的角度来看,无论如何我更喜欢 C# 方式。

于 2009-02-24T14:25:14.063 回答
1

Visual Studio 是否允许您在本地范围内声明 C# 对象的静态句柄?

SUTAdapter::Form1^ theForm() {
   static SUTAdapter::Form1^ form1 = gcnew SUTAdapter::Form1();
   return form1;
}
于 2009-02-24T13:52:30.867 回答
1

好的,谢谢您的回答,但我终于解决了,我发现它在谷歌上搜索:

http://bytes.com/groups/net-vc/473036-how-define-global-com-object-vc-8-a

似乎 VS 不允许在函数中使用全局句柄或静态句柄。我对此感到困惑,因为有时需要全局访问托管对象。

解决方案是声明一个带有静态句柄的“GlobalObjects”类:

ref class GlobalObjects
{
public:
static SUTAdapter::Form1^ hndForm1;
};

这样我就可以全局访问 C# 表单/类。上一个错误的错误代码是C3145,我还在想为什么VS不允许声明全局句柄。

于 2009-02-24T14:03:07.610 回答
1
*ptForm1 = gcnew SUTAdapter::Form1();

给出一个空引用异常,因为您正在取消引用一个空指针 - 在这方面它就像指向任何其他类型的指针。

于 2009-02-24T14:08:57.957 回答
0

我认为 - 并且没有测试它 - 你遇到的问题是因为你正在存储一个指向本地句柄的指针,这可能会使垃圾收集器有点困惑,因为你正在获取一个指向自动对象。

您是否尝试将上述作业替换为


*ptForm1 = gcnew SUTAdapter::Form1();

而不是通过本地对象引用绕道而行?

于 2009-02-24T13:32:06.297 回答