2013-02-04 5 views
0

이 오류는 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(); 
    ... 
} 

새로운 코드는 다음과 같습니다.하지만 아직 도구로 테스트 할 수 없습니다. 나는 기회가있을 때 업데이트 할 것이다.

답변

0

클래스를 관리하고 핸들을 직접 선언하면 예외가 발생합니까? 마찬가지로 :

ref class User 
{ 
public: 
    M3D_FP_USB^ obj; 

    ... 
}; 

당신이 그것을하고있는 방법을 작동하지 않을 이유가 표시되지 않지만

...

+0

네, 시도 래퍼 클래스가. User 클래스는 너무 많은 관리되지 않는 물건을 가지고있어서 그것을 변경합니다. 게시물을 코드로 업데이트했습니다. – FvD

관련 문제