2009-07-17 5 views
3

안녕하세요 저는이 코드를 사용하여 컴퓨터 서명을 생성하고 있습니다. 그러나 실행하는데 눈에 띄는 시간이 필요합니다. 왜 그렇게 느린지 궁금합니다. 더 빠른 방법을 권장합니까?더 빠른 방법으로 볼륨 일련 번호를 얻으시겠습니까?

Public Shared Function DriveSN(ByVal DriveLetter As String) As String 
    Dim disk As ManagementObject = New ManagementObject(String.Format("Win32_Logicaldisk='{0}'", DriveLetter)) 
    Dim VolumeName As String = disk.Properties("VolumeName").Value.ToString() 
    Dim SerialNumber As String = disk.Properties("VolumeSerialnumber").Value.ToString() 
    Return SerialNumber.Insert(4, "-") 
End Function 

Private Shared msig As String = Nothing 

Public Shared Function MachineSignature() As String 
    If msig Is Nothing Then 
     Dim list As New List(Of String) 
     For Each d As DriveInfo In DriveInfo.GetDrives() 
      If (d.IsReady) Then 
       list.Add(DriveSN(d.Name.Substring(0, 2))) 
      End If 
     Next 
     msig = String.Join(" & ", list.ToArray()) 
    End If 
    Return msig 
End Function 

답변

2

이 당황입니다. 성능 문제는 단순히 "고정"드라이브를 확인하여 해결할 수 있습니다.

Public Shared Function MachineSignature() As String 
    If msig Is Nothing Then 
     Dim list As New List(Of String) 
     For Each d As DriveInfo In DriveInfo.GetDrives() 
      If (d.DriveType = DriveType.Fixed) AndAlso (d.IsReady) Then ' <-- check for DriveType' 
       list.Add(DriveSN(d.Name.Substring(0, 2))) 
      End If 
     Next 
     msig = String.Join(" & ", list.ToArray()) 
    End If 
    Return msig 
End Function 
+0

어떻게 그게 문제인지 알았습니까? –

+0

디버거를 통한 스테핑. 다른 종류의 드라이브 (플로피, CD-ROM)를 검사하는 "IsReady"는 눈에 띄는 일시 정지를 취할 수 있습니다. 여기 미스테리는 없습니다. – Sake

0

Win32 API 호출이 있지만 여전히 관리 코드이므로 WMI가 더 좋은 방법이라고 생각합니다.

는 Win32 API 함수는 :

GetVolumeInformation 나는 eggheadcafe에 다음과 같은 기능을 발견 (그것의 C#을하지만, vb.net에서 할 문제가 아니다이어야 함) 일련 번호 추출 :이

public string GetVolumeSerial(string strDriveLetter) 
{ 
uint serNum = 0; 
uint maxCompLen = 0; 
StringBuilder VolLabel = new StringBuilder(256); // Label 
UInt32 VolFlags = new UInt32(); 
StringBuilder FSName = new StringBuilder(256); // File System Name 
strDriveLetter+=":\\"; // fix up the passed-in drive letter for the API call 
long Ret = GetVolumeInformation(strDriveLetter, VolLabel, (UInt32)VolLabel.Capacity, ref serNum, ref maxCompLen, ref VolFlags, FSName, (UInt32)FSName.Capacity); 

return Convert.ToString(serNum); 
} 
+1

이 코드가 작동하려면 GetVolumeInformation에 대한 선언을 포함시켜야합니다. – RobS

3

을 System.Management 네임 스페이스를 사용하는 egghead cafe의 .Net 방식입니다.

먼저 System.Management dll에 대한 참조를 vb.net에 추가해야합니다. 프로젝트 -> 참조 추가 메뉴 항목 사용.

그런 다음 다음 코드는 C 드라이브의 드라이브 일련 번호를 가져옵니다

Dim drive As String = "C" 
Dim disk As System.Management.ManagementObject = _ 
     New System.Management.ManagementObject _ 
     ("win32_logicaldisk.deviceid=""" + drive + ":""") 
disk.Get() 
Dim SerialNumber as String = disk("VolumeSerialNumber").ToString() 
관련 문제