VB. Net의 템플릿에는 .Net 표준(.Net Standard)이 기본적으로는 없는데

(나중에 추가 될꺼라고 생각하기는 하지만)

약간 돌아가면 사용하는 방법이 있다



먼저 새 프로젝트에서 이식 가능한 클래스 라이브러리를 생성한다

그리고 프로젝트 속성에 들어가면 아래와 같이 .NET 플랫폼 표준을 대상으로 지정이 있을 것이다

적용하려면 저장이 필요하기에 모두 저장을 통해 프로젝트를 한번 저장해주자

우리는 .NET 표준을 사용할 것이기 때문에 확인을 눌러준다

확인을 누르고 나면 아래와도 같이 .NET 표준으로 바뀌어 있다


여기까지 왔으면 다 된것 같지만 아직 해야 할 일이 남아있다


기본적으로 .NET 표준에서는모듈을 사용할수가 없는데

그래서 NuGet을 통해 "Microsoft.VisualBasic" 라이브러리를 따로 받아줘야 한다

해당 라이브러리는 Nuget 패키지 관리자를 통해 받을 수도 있고


아래와 같이 패키지 관리자 콘솔을 통해 다운로드 받을 수 있다

프리 릴리즈는 버그가 있을 수 있으니 안정적인 버전을 추천한다 (NuGet의 사용법을 모른다면 인터넷에 검색을 해 볼것)

그럼 이제 VB .Net을 통해 .NET 표준을 사용할 수 있다. 끝

posted by 자칭 프로그래머ㅡ ModMapper
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
Imports System.Text
Imports System.Net
Imports System.IO
Imports System.Xml
Imports System.Security
 
Module ParseAlSong
    Private Const URL As String = "http://lyrics.alsong.co.kr/alsongwebservice/service1.asmx"
 
    Private Const SendXML As String =
        "<?xml version=""1.0"" encoding=""UTF-8""?>" & vbCrLf &
        "<SOAP-ENV:Envelope " &
            "xmlns:SOAP-ENV=""http://www.w3.org/2003/05/soap-envelope"" " &
            "xmlns:SOAP-ENC=""http://www.w3.org/2003/05/soap-encoding"" " &
            "xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" " &
            "xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" " &
            "xmlns:ns2=""ALSongWebServer/Service1Soap"" " &
            "xmlns:ns1=""ALSongWebServer"" " &
            "xmlns:ns3=""ALSongWebServer/Service1Soap12"">" & vbCrLf &
        "  <SOAP-ENV:Body>" & vbCrLf &
        "    <ns1:GetLyric5><ns1:stQuery>" & vbCrLf &
        "    <ns1:strChecksum>{0}</ns1:strChecksum>" & vbCrLf &
        "    <ns1:strVersion></ns1:strVersion>" & vbCrLf &
        "    <ns1:strMACAddress></ns1:strMACAddress>" & vbCrLf &
        "    <ns1:strIPAddress></ns1:strIPAddress>" & vbCrLf &
        "    </ns1:stQuery></ns1:GetLyric5>" & vbCrLf &
        "  </SOAP-ENV:Body>" & vbCrLf &
        "</SOAP-ENV:Envelope>"
 
    Public Structure AlSongInfo
        Dim ID As Integer
        Dim RegistDate As Date
        Dim Title As String
        Dim Artist As String
        Dim Album As String
        Dim CGood As Integer
        Dim CBad As Integer
        Dim Lyric As String
        Dim FirstRegister As AlSongRegister
        Dim CurrentRegister As AlSongRegister
    End Structure
 
    Public Structure AlSongRegister
        Dim Name As String
        Dim eMail As String
        Dim URL As String
        Dim Phone As String
        Dim Comment As String
    End Structure
 
    Public Function GetMP3Info(FileName As StringAs AlSongInfo
        Using FS = New FileStream(FileName, FileMode.Open, FileAccess.Read)
            Return GetMP3Info(FS)
        End Using
    End Function
 
    Public Function GetMP3Info(Stream As Stream) As AlSongInfo
        '오디오 프레임에서 163840 바이트를 읽어 해시 값을 구함
        '해당 코드에서는 NuGet의 ID3를 사용함
        Const SampleSize As Integer = 163840
        Dim MD5 = Cryptography.MD5.Create()
        Dim Hash() As Byte
        Using MP3 As New Id3.Mp3Stream(Stream)
            Hash = MD5.ComputeHash(MP3.GetAudioStream(), 0, SampleSize)
        End Using
        Return GetInfo(BitConverter.ToString(Hash).Replace("-""").ToLower())
    End Function
 
    Public Function GetInfo(Checksum As StringAs AlSongInfo
        Dim Request = HttpWebRequest.CreateHttp(URL)
        Request.KeepAlive = False
        Request.Method = "POST"
        Request.UserAgent = "gSOAP/2.7"
        Request.ContentType = "application/soap+xml; charset=utf-8"
        Request.Headers.Add("SOAPAction""""ALSongWebServer/GetLyric5""")
        Using Stream = Request.GetRequestStream()
            WriteStream(Stream, Checksum)
        End Using
        Using Response = Request.GetResponse()
            Using Stream = Response.GetResponseStream()
                Return ParseStream(Stream)
            End Using
        End Using
    End Function
 
 
    Private Sub WriteStream(Stream As Stream, Checksum As String)
        Dim XML = Encoding.UTF8.GetBytes(String.Format(SendXML, Checksum))
        Stream.Write(XML, 0, XML.Length)
    End Sub
 
    Private Function ParseStream(Stream As Stream) As AlSongInfo
        Dim XML As New XmlDocument()
        XML.Load(Stream)
        Dim Node = XML.SelectSingleNode("*/*/*/*")
        If Node Is Nothing Then Return Nothing
        Dim Info As AlSongInfo
        With Info
            .ID = GetNodeValue(Node, "strInfoID")
            .RegistDate = GetNodeValue(Node, "strRegistDate")
            .Title = GetNodeValue(Node, "strTitle")
            .Artist = GetNodeValue(Node, "strArtist")
            .Album = GetNodeValue(Node, "strAlbum")
            .CGood = GetNodeValue(Node, "strCountGood")
            .CBad = GetNodeValue(Node, "strCountBad")
            .Lyric = GetNodeValue(Node, "strLyric").Replace("<br>", vbCrLf)
 
            .FirstRegister.Name = GetNodeValue(Node, "strRegisterFirstName")
            .FirstRegister.eMail = GetNodeValue(Node, "strRegisterFirstEMail")
            .FirstRegister.URL = GetNodeValue(Node, "strRegisterFirstURL")
            .FirstRegister.Phone = GetNodeValue(Node, "strRegisterFirstPhone")
            .FirstRegister.Comment = GetNodeValue(Node, "strRegisterFirstComment")
 
            .CurrentRegister.Name = GetNodeValue(Node, "strRegisterName")
            .CurrentRegister.eMail = GetNodeValue(Node, "strRegisterEMail")
            .CurrentRegister.URL = GetNodeValue(Node, "strRegisterURL")
            .CurrentRegister.Phone = GetNodeValue(Node, "strRegisterPhone")
            .CurrentRegister.Comment = GetNodeValue(Node, "strRegisterComment")
        End With
        Return Info
    End Function
 
    Private Function GetNodeValue(Node As XmlElement, Name As StringAs String
        Dim SubNode = Node.GetElementsByTagName(Name)
        If SubNode.Count = 0 Then Return ""
        Return SubNode(0).InnerText
    End Function
End Module
 
cs


Lyric이 가사임

posted by 자칭 프로그래머ㅡ ModMapper


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
Imports Microsoft.Win32
 
''' <summary>확장자로부터 아이콘을 가져오는 모듈입니다.</summary>
Public Module IconModule
    'Win API
    Private Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As IntPtrByVal lpszExeFileName As StringByVal nIconIndex As IntegerAs Integer
    Private Declare Function DestroyIcon Lib "User32.dll" (hIcon As IntPtrAs Integer
 
    ''' <summary>확장자으로 부터 아이콘을 가져옵니다.</summary>
    ''' <param name="Ext">확장자 값 입니다.</param>
    ''' <returns>가져온 아이콘입니다. 실패시 Nothing(NULL)을 반환힙니다.</returns>
    Public Function GetIconFromExt(Ext As StringAs Icon
        Dim Reg = Registry.ClassesRoot, Icon As Icon
        Reg = Reg.OpenSubKey(Ext, False)
        If Reg Is Nothing Then Return Nothing
        Icon = GetDefaultIcon(Reg)
        If Icon IsNot Nothing Then Return Icon
        Icon = GetOpenIcon(Reg)
        Dim Value As String = Reg.GetValue(Nothing)
        If Value Is Nothing Then Return Nothing
        Return GetIconFromAppClass(Value)
    End Function
 
    ''' <summary>AppClass로 부터 아이콘을 가져옵니다.</summary>
    ''' <param name="AppClass">AppClass 스트링입니다.</param>
    ''' <returns>가져온 아이콘입니다. 실패시 Nothing(NULL)을 반환힙니다.</returns>
    Public Function GetIconFromAppClass(AppClass As StringAs Icon
        Dim Reg = Registry.ClassesRoot
        Reg = Reg.OpenSubKey(AppClass, False)
        If Reg Is Nothing Then Return Nothing
        Return If(GetDefaultIcon(Reg), GetOpenIcon(Reg))
    End Function
 
    Private Function GetDefaultIcon(Reg As RegistryKey) As Icon
        Reg = Reg.OpenSubKey("DefaultIcon")
        If Reg Is Nothing Then Return Nothing
        Dim Value As String = Reg.GetValue(Nothing)
        If Value Is Nothing Then Return Nothing
        Dim FilePath As String = ""
        Dim Index As Integer
        Try
            ParsePath(Value, FilePath, Index)
        Catch 'Parse Error
            Return Nothing
        End Try
        Return GetIcon(FilePath, Index)
    End Function
 
    Private Function GetOpenIcon(Reg As RegistryKey) As Icon
        Reg = Reg.OpenSubKey("shell/open/command")
        If Reg Is Nothing Then Return Nothing
        Dim Value As String = Reg.GetValue(Nothing)
        If Value Is Nothing Then Return Nothing
        If Value.Length = 0 Then Return Nothing
        Dim FilePath As String = ""
        Dim Spt As Integer
        If Value(0= """"Then
            Spt = Value.IndexOf(""""c)
            FilePath = If(Spt = -1, Value.Substring(1), Value.Substring(1, Spt - 1))
        Else
            Spt = Value.IndexOf(" ")
            If Spt = -1 Then Spt = Value.Length
            FilePath = Value.Substring(0, Spt)
        End If
        Try
            FilePath = IO.Path.GetFullPath(FilePath)
        Catch 'Parse Error
            Return Nothing
        End Try
        Return GetIcon(FilePath, 0)
    End Function
 
    ''' <summary>아이콘의 경로를 파싱하는 함수입니다.</summary>
    ''' <param name="Path">아이콘의 경로입니다.</param>
    ''' <param name="FilePath">반환되는 아이콘 파일의 경로입니다.</param>
    ''' <param name="Index">반환되는 아이콘의 인덱스입니다.</param>
    Private Sub ParsePath(Path As StringByRef FilePath As StringByRef Index As Integer)
        Dim Spt As Integer
        Path = Path.Trim(" "c)
        FilePath = ""
        Index = 0
        If Path.Length = 0 Then Return
        If Path(0= """"Then
            Spt = Path.IndexOf(""""c)
            If Spt = -1 Then
                Spt = Path.Length
                FilePath = Path.Substring(1)
            Else
                FilePath = Path.Substring(1, Spt - 1)
                Spt += 1
            End If
        Else
            Spt = Path.IndexOf(",")
            If Spt = -1 Then Spt = Path.Length
            FilePath = Path.Substring(0, Spt)
        End If
        If Spt = Path.Length Then Return
        Index = CInt(Path.Substring(Spt + 1))
        FilePath = IO.Path.GetFullPath(FilePath)
    End Sub
 
    ''' <summary>아이콘을 가져오는 함수입니다.</summary>
    ''' <param name="FilePath">아이콘 파일의 경로입니다.</param>
    ''' <param name="Index">아이콘의 인덱스입니다.</param>
    ''' <returns>가져온 아이콘입니다. 실패시 Nothing(NULL)을 반환힙니다.</returns>
    Private Function GetIcon(FilePath As String, Index As IntegerAs Icon
        Dim hIcon As IntPtr
        hIcon = ExtractIcon(0, FilePath, Index)
        If hIcon = 0 Then Return Nothing
        Dim eIcon = Icon.FromHandle(hIcon).Clone()
        Call DestroyIcon(hIcon)
        Return eIcon
    End Function
End Module
 
cs


사용법은 주석 참조


IconModule.vb


posted by 자칭 프로그래머ㅡ ModMapper