我正在尝试在C ++ - CLI项目中使用C#类,但Visual Studio只允许我在一个函数内部向本地范围内的C#对象声明一个句柄(^)。我得到它的唯一方法是声明一个句柄的全局指针:
SUTAdapter::Form1^ *ptForm1;
但是如果那时我在函数内创建一个对象并将其地址赋给全局指针:
SUTAdapter::Form1^ form1;
form1 = gcnew SUTAdapter::Form1();
ptForm1 = &form1;
(*ptForm1)->incCounter(0);
当函数退出并且我尝试在其他一些C ++ - CLI函数中使用incCounter函数时,对象似乎消失了(调试器说这= = null)。有没有办法在C ++中使用C#代码进行全局处理 - CLI?我想全局句柄是出于某种原因我不明白但是我没有想法而且我需要这样做。谢谢。
编辑:
*ptForm1 = gcnew SUTAdapter::Form1();
提供空引用异常。为什么呢?
答案 0 :(得分:4)
此限制似乎与其他基于CLR的语言一致。例如,C#没有静态函数范围变量的概念。 C ++ / CLI中缺少此类功能表明这是CLR的工作方式 - 必须在类范围内定义静态对象。
CLR是基于对象的,所以这只是面向对象的一种情况,它会影响在其上运行的语言的设计。
从OO的角度来看,无论如何我更喜欢C#方式。
答案 1 :(得分:1)
Visual Studio是否允许您向本地范围内的C#对象声明静态句柄?
SUTAdapter::Form1^ theForm() {
static SUTAdapter::Form1^ form1 = gcnew SUTAdapter::Form1();
return form1;
}
答案 2 :(得分:1)
*ptForm1 = gcnew SUTAdapter::Form1();
给出一个空引用异常,因为你正在取消一个空指针 - 就像在这方面指向任何其他类型的指针一样。
答案 3 :(得分:0)
我认为 - 而且没有测试它 - 你遇到的问题是因为你正在存储一个指向本地句柄的指针,这可能会使垃圾收集器稍微混淆,因为你正在使用它指向自动对象的指针。
您是否尝试用
替换上述作业
*ptForm1 = gcnew SUTAdapter::Form1();
而不是通过本地对象引用绕道?
答案 4 :(得分:0)
好的谢谢你的回答,但我终于解决了,我发现谷歌搜索:
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#表单/类。 previoous错误的错误代码是C3145,我仍然想知道为什么VS不允许声明全局句柄。