요약: My 함수가 사용 가능한 클래스, 동적으로 생성된 클래스 및 스레딩을 포함하여 .NET Framework 기능을 노출하는 방법에 대한 개요입니다.
참고: 이 문서와 샘플 코드는 Microsoft Visual Studio 2005 시험판 버전(이전 코드명 "Whidbey")을 기반으로 합니다. 여기에 포함된 모든 정보는 변경될 수 있습니다. 샘플 프로젝트에는 Visual Studio2005Beta1 이상이 필요합니다.
소개
My는 자주 사용하는 기능을 손쉽게 사용할 수 있도록 하고 작성해야 하는 코드 줄 수를 줄이는 Visual Basic 2005의 새로운 기능입니다. 이는 효율적이고 안정적이며 스레드로부터 안전한 방식으로 수행됩니다. 프로그래머의 생산성이 특히 중요한 환경에서 My는 작업을 더 빠르게 완료할 수 있도록 도와줍니다. 이것이 바로 Visual Basic의 핵심입니다.
이 문서의 목적은 My를 사용하여 프로젝트의 .NET Framework 기능 및 항목에 액세스하는 방법을 살펴보는 것입니다.
내에서 사용 가능한 .NETFramework 클래스
.NET Framework에는 관련된 내용이 너무 많기 때문에 필요한 기능을 찾기가 어려울 수 있습니다. 이 문제를 해결하기 위해 My는 일반적으로 사용되는 .NET Framework 클래스 및 함수에 대한 진입점을 제공합니다. My는 또한 관련 기능을 작업 기반 API로 집계하는 새로운 고급 .NET Framework 클래스를 공개합니다.
My는 인스턴스화되어 사용할 준비가 된 .NETFramework 클래스를 반환하고, .NETFramework 메서드에 대한 호출을 연기하고, 프로젝트의 항목에 액세스하는 데 사용할 수 있는 동적으로 생성된 클래스를 반환하여 기능을 노출합니다.
직접 공개
가능할 때마다 My는 .NET Framework의 기존 클래스에 대한 검색 메커니즘 역할을 하며 이러한 형식을 직접 노출합니다. 다음 My.application.Deployment 예제를 참조하세요.
PublicReadOnlyPRpertyDeployment()As_
시스템.배포.애플리케이션배포
얻다
반품_
시스템.배포.애플리케이션배포.현재배포
종료
EndProperty
직접 노출의 다른 예로는 My.Computer.FileSystem.OpenTextFileReader()(System.IO.StreamReader 반환), My.Application.OpenForms()(System.Windows.Forms.FormsCollection 반환), My.User(System.IO.StreamReader 반환)가 있습니다. System.Security.Principal.IPrincipal) 등
모습
또한 기능을 찾는 것이 어려웠거나 함께 작동하려면 여러 개체가 필요했기 때문에 이전에는 수행하기 어려웠던 작업을 수행하기 위한 작업 기반 API를 제공하는 새 클래스를 반환할 수도 있습니다.
낮은 수준의 .NET Framework API를 사용해야 하거나 여러 줄의 코드가 필요한 일반적인 작업이 크게 단순화되었습니다. 네트워크 연결이 가능한지 확인하려면 다음 작업 예를 참조하십시오.
ImportsSystem.Net.NetworkInformation
PublicReadOnlyPropertyIsAvailable()AsBoolean
얻다
ForEachNetInterfaceAsNetworkInterfaceIn_
NetworkInterface.GetAllNetworkInterfaces()
IfNetInterface.Type<>InterfaceType.Loopback_
AndAlsoNetInterface.Type<>InterfaceType.Tunnel_
AndAlsoNetInterface.OperationalStatus=_
OperationalStatus.UpThen
ReturnTrue
종료
다음
반환거짓
종료
EndProperty
위 코드를 사용하려면 System.Net.NetworkInformation 네임스페이스의 여러 유형에 대한 자세한 지식이 필요합니다. My.Computer.Network는 모양 패턴을 사용하여 이러한 유형과 해당 관계를 My.Computer.Network.IsAvailable()이라는 한 줄의 코드로 줄입니다.
모양새는 다른 방법으로는 찾기 어려운 관련 기능을 간단히 모아 놓을 수도 있습니다. 예를 들어 My.Computer는 다양한 클래스의 속성을 결합하여 컴퓨터 이름과 화면에 대한 액세스를 제공합니다.
PublicReadOnlyPropertyName()AsString
얻다
ReturnSystem.Environment.MachineName
종료
EndProperty
PublicReadOnlyPropertyScreen()AsSystem.Windows.Forms.Screen
얻다
ReturnSystem.Windows.Forms.Screen.PrimaryScreen
종료
EndProperty
여러 .NET Framework 유형의 관련 기능을 통합하는 My 클래스의 다른 예로는 My.Application, My.Computer, My.Computer.FileSystem, My.Computer.Info 및 My.Application.Info가 있습니다.
프록시 클래스
프록시 클래스는 모든 호출을 기본 개체로 전달하는 매우 "얇은" 클래스입니다. 예를 들어 My.Computer.Clipboard.GetText()를 호출하는 경우 실제로는 다음과 같이 정의된 프록시 클래스 메서드 ClipboardProxy.GetText()를 호출하는 것입니다.
PublicFunctionGetText()AsString
리턴클립보드.GetText()
EndFunction
규칙에 따라 프록시 클래스에는 항상 접미사 Proxy가 붙습니다. 프록시에 의해 노출되는 기본 클래스는 IntelliSense에 표시되지 않는 공유 메서드로 구성되어 있으므로 클립보드, 파일 시스템 및 레지스트리에 액세스할 때 프록시를 사용합니다. 사용자는 Proxy 클래스를 인스턴스화할 수 없습니다. 성능 테스트에 따르면 프록시를 통해 통화를 전달하는 것은 의미가 없는 것으로 나타났습니다.
동적으로 생성된 클래스
My는 "손끝에 기능을 추가"한다는 목적에 따라 프로젝트에 정의된 양식, 웹 서비스, 리소스 및 설정에 대한 액세스를 제공합니다. 예를 들어 프로젝트에 웹 서비스 MapDirections에 대한 참조가 포함되어 있는 경우 웹 서비스 프록시 인스턴스를 시작하는 방법을 알 필요 없이 즉시 웹 서비스를 사용할 수 있습니다. 다음을 입력하면 됩니다: My.WebServices.MapDirections.GetDirections(...)
어떻게 작동하나요? 팩토리 클래스는 프로젝트의 양식, 웹 서비스, 설정 및 리소스에 대해 요청 시 느리게 생성된 인스턴스를 반환하는 컴파일러에 의해 생성됩니다. 팩토리 클래스는 코드가 실행되는 프로젝트 유형(exe/dll/web)에 적합한 방식으로 인스턴스를 반환하도록 조정되었습니다. 자세한 내용은 "스레딩" 섹션을 참조하세요.
내 양식
동적으로 생성된 클래스의 예로 My.Forms를 고려해 보세요. 이 클래스는 귀하에게 제공되며 프로젝트의 각 양식에 대한 팩토리 메소드를 정의합니다. My.Forms.Form1을 통해 Form에 액세스하면 팩터리 메서드는 Form1의 인스턴스가 이미 열려 있는지 확인합니다. 인스턴스가 이미 열려 있으면 해당 인스턴스가 반환됩니다. 그렇지 않으면 Form1의 인스턴스가 생성되어 반환됩니다. Form1을 포함하는 프로젝트에 대해 생성된 코드는 다음과 같습니다.
ClassMyForms
'컴파일러에 의해 생성된 코드는 굵게 표시됩니다.
Publicm_Form1AsForm1
PublicPropertyForm1()AsForm1
얻다
m_Form1=Create__Instance__(OfForm1)(m_Form1)
Returnm_Form1
종료
설정(ByValValueAsForm1)
IfValueIsm_Form1
반품
종료
IfNotValueIsNothingThen
ThrowNewArgumentException(_
속성은 아무것도 설정하지 않을 수 있습니다.)
종료
Dispose__Instance__(OfForm1)(m_Form1)
엔드셋
EndProperty
EndClass
Create__Instance__() 함수는 요청 시 양식의 인스턴스를 생성하는 역할을 합니다. m_Form1에 저장된 양식이 인스턴스화되었는지 확인합니다. 양식이 이미 인스턴스화된 경우 양식이 반환됩니다. 그렇지 않으면 인스턴스가 생성되어 반환됩니다. Create__Instance__()는 재귀적인 양식 생성 시도도 캡처합니다. Dispose__Instance__()는 양식 닫기를 담당합니다.
My.Forms는 또한 이전 버전의 Visual Basic에서 익숙할 수 있는 양식의 기본 인스턴스를 다시 도입하는 방법을 제공합니다. 기본 인스턴스를 사용하면 먼저 양식의 인스턴스를 명시적으로 생성하지 않고도 양식의 인스턴스를 참조할 수 있습니다.
예를 들어 Visual Basic 6.0에서는 대신 Form1.Show()를 작성했을 수도 있습니다.
DimForm1InstanceasForm1
Form1Instance=newForm1
Form1Instance.Show()
Visual Basic 2005의 컴파일러는 My.Forms를 사용하여 기본 인스턴스를 생성하므로 Form1.Show()만 작성하면 됩니다.
My.WebServices
웹 서비스를 코딩할 때 사람들이 겪는 어려움 중 하나는 코딩할 클래스를 결정하는 것입니다. My.WebServices는 이러한 결정 프로세스를 제거하고 요청 시 웹 서비스 프록시 인스턴스를 제공합니다.
My.WebServices는 웹 서비스에 대한 동기 호출에 가장 적합합니다. 웹 서비스 프록시의 인스턴스를 제공하기 위해 생성된 코드 패턴은 양식의 인스턴스를 반환하기 위해 표시된 코드 패턴과 동일합니다.
내 설정
Visual Basic 2005의 새로운 기능은 응용 프로그램 또는 사용자별로 응용 프로그램 설정을 지정할 수 있는 설정 디자이너입니다. 디자이너는 강력한 형식의 방식으로 설정에 액세스하는 데 사용할 수 있는 클래스를 만듭니다. 솔루션 탐색기에 모든 파일을 표시하고 MySettings.Settings 노드 아래에서 MySettings.vb 파일을 찾아 MySettings 클래스의 예를 볼 수 있습니다.
다음은 SampleUserSetting이라는 애플리케이션 설정을 관리하기 위해 생성된 속성의 예입니다.
PartialNotInheritableClassMySettings
InheritsSystem.Configuration.ApplicationSettingsBase
<System.Diagnostics.DebuggerNonUserCode(),_
System.Configuration.UserScopedSettingAttribute(),_
System.Configuration.DefaultSettingValueAttribute(TryMe)>_
PublicPropertySampleUserSetting()AsString
얻다
ReturnCType(나(SampleUserSetting),문자열)
종료
세트
나(SampleUserSetting)=값
엔드셋
EndProperty
EndClass
생성된 클래스는 모든 무거운 작업을 수행합니다. 이 설정에 액세스하려면 다음을 입력하세요.
내.설정.샘플사용자 설정
내.자원
Visual Basic 2005의 또 다른 새로운 기능은 응용 프로그램에 리소스를 추가할 수 있는 리소스 디자이너입니다. 또한 리소스 디자이너는 강력한 형식의 방식으로 애플리케이션의 리소스에 액세스하는 데 사용할 수 있는 모듈을 만듭니다. 예를 들어 프로젝트에 Smiley라는 비트맵을 추가하면 My.Resources.Smiley를 사용하여 비트맵에 액세스할 수 있습니다. 샘플 프로젝트의 솔루션 탐색기에 모든 파일을 표시하고 MyResources.resx 노드에서 MyResources.vb 파일을 찾아 생성된 리소스 모듈의 예를 볼 수 있습니다.
다음은 Smiley 리소스에 대한 팩터리 속성을 반환하기 위해 생성된 샘플 프로젝트의 예입니다.
PublicReadOnlyPropertySmiley()AsSystem.드로잉.Bitmap
얻다
ReturnCType(ResourceManager.GetObject(Smiley,_resCulture),_
시스템.드로잉.비트맵)
종료
EndProperty
생성된 강력한 형식의 리소스 모듈은 대소문자를 구분하는 리소스 ID를 처리하고, System.Resources.ResourceManager 클래스를 사용하여 리소스를 검색하고, 애플리케이션에 대해 올바르게 생성된 ResourceManager를 가져오는 것과 관련된 세부 정보를 관리합니다.
VisualBasic2002 또는 VisualBasic2003에서 동일한 스마일리 비트맵에 액세스하려면 먼저 비트맵을 .resx 파일에 넣어야 하는데 이는 어렵습니다. 또 다른 방법은 이를 프로젝트에 포함된 리소스로 넣는 것입니다. 그리고 포함된 리소스가 될 리소스의 속성 그리드에서 빌드 작업을 변경해야 한다는 것을 기억해야 합니다. 이런 방식으로 작성하는 코드는 다음과 같아야 합니다.
DimCurrentAssemblyAsReflection.Assembly=_
Reflection.Assembly.GetExecutingAssembly
DimBitMapStreamAsIO.Stream=_
CurrentAssembly.GetManifestResourceStream(_
WindowsApplication2.Smiley.bmp)
DimSmileyBitmapas드로잉.Bitmap=NewBitmap(BitMapStream)
이 코드에는 알아야 할 몇 가지 중요한 세부 정보가 있습니다. 현재 실행 중인 어셈블리를 가져오고 이에 대해 GetManifestResourceStream()을 호출하는 방법을 알아야 합니다. 루트 네임스페이스 이름으로 리소스 이름을 한정해야 한다는 것을 기억해야 합니다. GetManifestResourceStream()에 전달된 이름은 대소문자를 구분하므로 대소문자 권한을 받아야 합니다. 스트림 개체에서 GetManifestResource의 반환 값을 캡처할 수 있도록 스트림 클래스를 정의할 위치를 알아야 합니다. 스트림에서 비트맵을 만드는 방법을 알아야 합니다. 위의 문제 중 하나로 인해 BitMapStream이 항상 아무것도 반환하지 않는 이유를 확인하려고 할 때 좌절감을 느낄 수 있습니다.
Visual Basic 2005는 새로운 리소스나 기존 리소스를 .resx 파일에 쉽게 배치할 수 있는 ResourceEditor를 제공하여 첫 번째 문제를 해결합니다. 그런 다음 My를 사용하여 이러한 리소스에 쉽게 액세스할 수 있습니다. 당신이 해야 할 일은 다음을 작성하는 것뿐입니다.
DimSmileyBitmapas드로잉.Bitmap=My.Resources.Smiley
스레딩
My 개체의 인스턴스는 스레드별로 제공되므로 My에서 사용 가능한 클래스 인스턴스는 스레딩 문제를 완화하는 방식으로 노출됩니다. 즉, 스레드 1에서 반환된 My.Computer의 인스턴스는 스레드 2에서 반환된 My.Computer의 인스턴스와 다릅니다. 즉, My 개체를 사용할 때 동기화 코드를 작성할 필요가 없습니다.
웹 애플리케이션에서는 My에서 반환된 인스턴스가 요청 시 저장됩니다.
요약
My가 .NET Framework 클래스를 노출하는 방법과 My를 보완하기 위해 동적으로 생성된 클래스를 생성하는 방법을 살펴보았습니다.
마지막으로 My는 작성해야 하는 코드 줄 수를 줄이고 일반적으로 사용되는 기능에 대한 액세스를 제공합니다. 이는 효율적이고 안정적이며 스레드로부터 안전한 방식으로 수행됩니다. 프로그래머의 작업 효율성이 특히 중요한 환경에서 My는 작업을 보다 빠르고 효과적으로 완료할 수 있도록 도와줍니다.
->