我试图在一个C++-CLI项目中使用一个C#类,但是Visual Studio只允许我在一个局部作用域中声明一个C#对象的句柄(^),就在一个函数内部。我让它工作的唯一方法是声明一个指向句柄的全局指针:
SUTAdapter::Form1^ *ptForm1;但如果我在函数内部创建了一个对象,并将其地址提供给全局指针:
SUTAdapter::Form1^ form1;
form1 = gcnew SUTAdapter::Form1();
ptForm1 = &form1;
(*ptForm1)->incCounter(0);当函数退出时,当我尝试在其他C++-CLI函数中使用incCounter函数时,对象似乎消失了(调试器显示此==为空)。有没有办法在C++-CLI中拥有C#代码的全局句柄?我猜全局句柄是被禁止的,因为我不明白什么原因,但是我已经没有想法了,我需要完成这个任务。谢谢。
编辑:
*ptForm1 = gcnew SUTAdapter::Form1();给出空引用异常。为什么?
发布于 2009-02-24 14:25:14
这一限制似乎与其他基于CLR的语言一致。例如,C#没有静态的、函数作用域变量的概念。C++/CLI中缺乏这样的功能表明这就是CLR的工作方式-静态对象必须在类作用域中定义。
CLR是基于对象,因此这只是面向对象性质影响在其上运行的语言设计的一个例子。
从面向对象的角度来看,我更喜欢C#的方式。
发布于 2009-02-24 13:52:31
Visual Studio是否允许您在本地范围内声明C#对象的静态句柄?
SUTAdapter::Form1^ theForm() {
static SUTAdapter::Form1^ form1 = gcnew SUTAdapter::Form1();
return form1;
}发布于 2009-02-24 14:03:08
好的,谢谢你的回答,但我终于解决了,我发现它在谷歌上搜索:
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不允许声明全局句柄。
https://stackoverflow.com/questions/581682
复制相似问题