使用gcroot时System.NullReferenceException

时间:2013-02-04 09:28:52

标签: c++-cli command-line-interface managed handles

原来这个错误与gcroot没有任何关系 - 我连接了一些构造函数并且在路上丢失了实例化的对象。

为了记录,以下代码的所有版本都在此修复后工作,但添加简单的Wrapper类允许您使用&和包装对象上的*运算符,gcroot禁止。我使用的是下面第三个代码块中概述的版本。


我试图通过.dll使用一些测量仪器,但我遇到了实施问题。将所有代码写入main.cpp并使用像这样的对象可以正常工作:

#using "M3D_FP_USB.dll"
int main(){
    M3D_FP_USB ^obj = gcnew M3D_FP_USB;
    obj->Connect();
    ...
}

然而,当我把它放入一个类并用gcroot包装它时,我得到一个“未处理的异常:System.NullReferenceException:对象引用未设置为对象的实例”。

class User{       
    ...
public:
    User();
    gcroot<M3D_FP_USB^> obj;
}

User::User(){
    obj = gcnew M3D_FP_USB;
    obj->Connect();
    ...
}

我怀疑gcroot或它在非托管类中被调用可能会阻止这些工具访问M3D_FP_USB对象。我尝试添加托管的Wrapper类,并为User类提供Wrapper对象的句柄。但这并没有解决问题。

class User{       
    ...
public:
    gcroot<Wrapper^> wobj;
}

ref class Wrapper{
    ...
public:
    M3D_FP_USB^ iobj;
    ...
}

Wrapper::Wrapper(){
    iobj = gcnew M3D_FP_USB;
    iobj->Connect();
    ...
}

我看到的新代码看起来像这样,但我还是无法用仪器测试它。我有机会时会更新。

Wrapper::Wrapper(M3D_FP_USB^ obj){
    iobj = obj;
    iobj->Connect();
    ...
}

int main(){
    M3D_FP_USB ^obj = gcnew M3D_FP_USB;
    Wrapper Ex(obj);
}

1 个答案:

答案 0 :(得分:0)

如果您对类进​​行管理并直接声明句柄,是否也会发生异常?像:

ref class User
{
public:
    M3D_FP_USB^ obj;

    ...
};

虽然我不明白为什么它不会像你那样工作......