나는 내 코드에서 가지고있는 클래스의 구조체를 초기화하려고하고있다. 이것은 .NET에 대한 문서가 거의없는 제 3 자 클래스이므로 구조 내에서 고정 길이로 정의 된 일부 Char 변수의 초기화에 빠져 있습니다.구조체에서 고정 길이 Char 변수를 올바르게 초기화하는 방법은 무엇입니까?
이것은 3 부 클래스의 구조입니다.
<StructLayout(LayoutKind.Sequential,Pack:=4)> _
Public Structure ODBSYS
Public addinfo As Short
Public max_axis As Short
<MarshalAs(UnmanagedType.ByValArray,SizeConst:=2)> _
Public cnc_type As Char()
<MarshalAs(UnmanagedType.ByValArray,SizeConst:=2)> _
Public mt_type As Char()
<MarshalAs(UnmanagedType.ByValArray,SizeConst:=4)> _
Public series As Char()
<MarshalAs(UnmanagedType.ByValArray,SizeConst:=4)> _
Public version As Char()
<MarshalAs(UnmanagedType.ByValArray,SizeConst:=2)> _
Public axes As Char()
End Structure
그리고이 작업 기능 미안하다 :
Private Function GetControlInfo()
Dim CNCSys As Focas1.ODBSYS
CNCSys.addinfo = 0
CNCSys.max_axis = 0
CNCSys.cnc_type = ""
CNCSys.mt_type = ""
CNCSys.series = ""
CNCSys.version = ""
CNCSys.axes = ""
Try
intHandleNo = Focas1.cnc_sysinfo(LibHndl, CNCSys)
MessageBox.Show("AddInfo: " & CNCSys.addinfo.ToString & vbCrLf & _
"MaxAxis: " & CNCSys.max_axis.ToString & vbCrLf & _
"CNCType: " & CNCSys.cnc_type.ToString & vbCrLf & _
"MTType: " & CNCSys.mt_type.ToString & vbCrLf & _
"Series: " & CNCSys.series.ToString & vbCrLf & _
"Version: " & CNCSys.version.ToString & vbCrLf & _
"Axes: " & CNCSys.axes.ToString)
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
Return Nothing
End Function
나는 바로 CSYS의 생성 후에이 변수 초기화 코드를 추가하지는 경우
CNCSys.addinfo = 0
CNCSys.max_axis = 0
CNCSys.cnc_type = ""
CNCSys.mt_type = ""
CNCSys.series = ""
CNCSys.version = ""
CNCSys.axes = ""
I 오류 목록 영역에서 짜증나는 메시지를 얻습니다 (구조체의 변수를 초기화하지 않기 때문에).
"경고 변수 'CNCSys'는 값이 할당되기 전에 참조로 전달됩니다. 런타임시 널 참조 예외가 발생할 수 있습니다. 구조 또는 모든 참조 멤버를 사용하기 전에 초기화해야합니다. "
자, 코드를 추가하면 초기화되지 않은 변수에 대한 경고가 풀리고 솔루션을 빌드하고 실행할 수 있습니다. 그러나 함수가 GetControlInfo
일 때 라고,이 excception를 얻을 :
내가 키우면 그 때문이라고 생각
"내장 배열 인스턴스의 길이가 레이아웃에서 선언 된 길이와 일치하지 않기 때문에 형식이 마샬링 수 없습니다" 변수는 구조체의 Char vars이며 고정 길이가 있습니다 ... 그리고 저는 어떻게 든 초기화되지 않습니다. g 구조체 정의에서 가지고있는 것과 같은 길이를 가진 것들 ...
여기서 내가 뭘 잘못하고 있니? 컴파일러가 초기화되지 않은 변수에 대한 메시지를 보내지 않도록 마샬링에 문제가 없도록 어떻게 초기화 할 수 있습니까?
감사합니다.