이 오류는 gcroot와 아무런 관련이 없습니다. 일부 생성자를 shoddily에 연결하고 그 과정에서 인스턴스화 된 객체를 잃어 버렸습니다.gcroot를 사용하는 경우 System.NullReferenceException
아래 코드의 모든 버전이 수정 된 후에 작동하지만 간단한 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();
...
}
새로운 코드는 다음과 같습니다.하지만 아직 도구로 테스트 할 수 없습니다. 나는 기회가있을 때 업데이트 할 것이다.
네, 시도 래퍼 클래스가. User 클래스는 너무 많은 관리되지 않는 물건을 가지고있어서 그것을 변경합니다. 게시물을 코드로 업데이트했습니다. – FvD