【问题标题】:System.NullReferenceException when using gcroot使用 gcroot 时出现 System.NullReferenceException
【发布时间】:2023-03-25 22:35:01
【问题描述】:

原来这个错误与 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 类,并将 Wrapper 对象的句柄提供给 User 类。不过,这并没有解决问题。

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);
}

【问题讨论】:

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


    【解决方案1】:

    如果您将类设为托管并直接声明句柄,是否也会发生异常?喜欢:

    ref class User
    {
    public:
        M3D_FP_USB^ obj;
    
        ...
    };
    

    虽然我不明白为什么它不能按照你的方式工作......

    【讨论】:

    • 是的,我在 Wrapper 类中尝试过。 User 类拥有太多非托管的东西来改变它。我用代码更新了帖子。
    猜你喜欢
    • 2023-03-25
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2014-10-21
    • 2018-06-24
    • 1970-01-01
    • 2010-11-30
    相关资源
    最近更新 更多