原来这个错误与 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);
}