.NET의 COM+ 서비스 사용

Microsoft .NET으로 업그레이드

Tim McCarthy, InterKnowlogy
Paul D. Sheriff, PDSA, Inc.

요약: 새로운 Microsoft .NET 구성 요소를 기존 COM과 COM+ 응용 프로그램에 추가하여 함께 작업할 수 있습니다. 이렇게 하면 트랜잭션에 참여하고 역할 기반 보안을 활용하거나 대기열과 상호 작용하는 등의 작업을 할 수 있는 .NET 응용 프로그램을 개발하는 데 도움이 됩니다(14페이지/인쇄 페이지 기준).

목표

Microsoft .NET에서 COM+ 서비스 사용에 대해 학습합니다.

서비스를 제공하는 구성 요소를 만듭니다.

서비스를 제공하는 구성 요소를 배포합니다.

가정

이 문서를 제대로 활용하려면 다음이 필요합니다.

MTS(Microsoft Transaction Server)를 사용하여 Microsoft Visual Basic 6.0에 트랜잭션을 배포합니다.

COM+ 서비스에서 역할 기반 보안을 사용합니다.

COM+ 서비스에서 대기열을 만들고 사용합니다.

.NET 클래스에 대해 잘 알고 있습니다.

.NET으로 콘솔 응용 프로그램 만드는 작업 대해 잘 알고 있습니다.

목차

.NET의 COM+ 서비스 사용
트랜잭션 기반 구성 요소 개발
역할 기반 보안
대기 중인 구성 요소 사용
Visual Basic 6.0 이후 버전의 COM+과의 차이
요약

.NET의 COM+ 서비스 사용

COM+ 응용 프로그램을 사용하여 Visual Basic 또는 C++에서 작성한 구성 요소를 호스트합니다. COM+는 트랜잭션, 대기 중인 구성 요소, Just-In-Time 활성화, 역할 기반 보안, 공유 속성 등 여러 유용한 서비스를 제공합니다. 구성 요소를 호스트하는 데 COM+을 사용하는 이점 중 하나는 코드를 만들지 않고도 구성 요소의 트랜잭션 지원을 필수로 표시하는 등 구성 요소가 작동하는 방법을 변경할 수 있다는 것입니다. 구성 요소 서비스 MMC 스냅인 내에서 COM+ 구성 요소에 라디오 단추를 설정하면 구성 요소를 만들 때마다 COM+ 트랜잭션의 컨텍스트에서 구성 요소가 만들어집니다. 구성 요소가 COM+ 트랜잭션을 사용하면 모든 데이터베이스 트랜잭션은 DTC(분산 트랜잭션 코디네이터)에 의해 처리됩니다. 그림 1은 구성 요소 서비스 인터페이스 내에서 필수 트랜잭션 옵션을 설정하는 예제를 보여줍니다.

그림 1. 트랜잭션이 필요한 COM+ 구성 요소 예제

구성 요소의 보안을 설정하는 것은 트랜잭션 지원을 설정하는 것만큼 쉽습니다. COM+ 서비스 스냅인을 사용하면 코드를 다시 컴파일하지 않고도 어떤 사용자가 어떤 구성 요소 또는 메서드를 실행할지 선택할 수 있습니다.

모든 COM+ 서비스를 사용할 수 있는 .NET

클래스가 System.EnterpriseServices.ServicedComponent 클래스에서 파생된 경우라면 .NET Framework에서도 COM+이 제공하는 모든 서비스를 사용할 수 있습니다. ServicedComponent 클래스에서 파생된 모든 클래스는 COM+ 서비스에 의해 호스트되기 때문에 모든 COM+ 서비스를 사용할 수 있습니다. 표 1은 .NET에 지원된 모든 COM+ 서비스와 각 서비스에 대한 간단한 설명을 보여줍니다.

표 1. 사용 가능한 COM+ 서비스

COM+ 서비스

설명

트랜잭션 자동 처리

선언적 트랜잭션 처리 기능을 적용합니다.

COMTI(COM Transaction Integrator)

자동화 개체에 CICS 및 IMS 응용 프로그램을 캡슐화합니다.

리소스 보상 관리자(CRM)

비트랜잭션 리소스에 원자성 및 내구성이 있는 속성을 적용합니다.

Just-In-Time 활성화

메서드 호출의 개체를 활성화하고 호출이 반환되면 비활성화합니다.

소결합 이벤트

개체 기반 이벤트를 관리합니다.

개체 생성

인스턴스를 생성할 때 영구 문자열 값을 클래스 인스턴스에 전달합니다.

개체 풀링

이미 만들어진 개체의 풀을 제공합니다.

대기 중인 구성 요소

비동기 메시지 대기열을 제공합니다.

역할 기반 보안

역할을 기반으로 하는 보안 권한을 적용합니다.

공유 속성

서버 프로세스 내에 여러 개체 간의 상태를 공유합니다.

동기화(작업)

동시성을 관리합니다.

XA 상호 운용성

X/Open 트랜잭션 프로세싱 모델을 지원합니다.

.NET의 COM+ 서비스를 사용하는 이유

트랜잭션에 참여, 역할 기반 보안 활용, 대기열과의 상호 작용과 같은 작업을 할 수 있도록 .NET 응용 프로그램을 작성하는 경우 .NET에 제공된 COM+ 서비스를 사용할 수 있습니다. .NET에서는 이러한 서비스를 쉽게 구현할 수 있으며 이 설명서에서 학습하게 됩니다.

팁      COM+ 서비스에서 .NET 코드를 사용할 필요가 없는 경우 즉, .NET Framework에서만 작업할 경우에는 성능 저하되므로 인해 System.EnterpriseServices를 사용하지 않도록 합니다.

COM+ 구성 요소 개발 개요

COM+ 서비스와 상호 작용할 .NET 구성 요소를 만들 때 다음 단계를 실행합니다. 표 2에는 각 단계의 설명이 있습니다.

클래스 라이브러리를 만듭니다.

System.EnterpriseServices.ServicedComponents 클래스로부터 상속하도록 모든 클래스를 만듭니다.

어셈블리를 만듭니다.

강력한 이름을 만듭니다.
표 2. .NET 구성 요소 만들기에 사용되는 항목 정의

항목

설명

클래스 라이브러리

클래스를 포함하는 .dll 프로젝트 유형입니다. 이 유형의 프로젝트에는 일반적으로 사용자 인터페이스가 없습니다.

System.EnterpriseServices.ServicedComponents

COM+ 서비스와 상호 작용하는 데 필요한 .NET Framework의 클래스입니다.

어셈블리

프로젝트 내에 있는 모든 클래스 및 인터페이스의 설명입니다.

강력한 이름

어셈블리에서 GUID를 생성하여 구성 요소가 COM+ 서비스에 등록될 수 있도록 합니다.

트랜잭션 기반 구성 요소 개발

이 설명서 앞 부분에서는 COM+의 트랜잭션 서비스를 사용하는 .NET 구성 요소 만들기에 대해 학습합니다. 구성 요소 및 이 구성 요소와 상호 작용하는 프런트 앤드 응용 프로그램 작성 방법을 배웁니다.

COM+ 트랜잭션 구성 요소 만들기

COM+ 서비스에서 .NET 구성 요소를 실행하려면 몇 가지 단계를 실행해야 합니다. 먼저, System.EnterpriseServices.ServicedComponent 클래스에서 파생되는 클래스를 만들어야 합니다. 이 기본 클래스는 COM+ 서비스와 상호 작용하는 데 필요한 모든 해당 메서드와 속성을 제공합니다. 새로운 트랜잭션이 필요하도록 해당 클래스를 표시하고 오류가 발생하지 않을 경우 트랜잭션을 자동으로 완료하도록 만드는 모든 메서드를 표시해야 합니다. 이 작업을 실행해 봅시다.

Microsoft Visual Studio .NET을 열고 새 ClassLibrary 프로젝트를 만듭니다.

Class1.vb 파일의 이름을 COMPlusServices.vb로 바꿉니다.

COMPlusServices.vb 파일을 열고 클래스 이름을 Class1에서 COMPlusServices로 바꿉니다.

이 새 클래스에 아래 표시된 코드를 입력합니다.
Imports System.EnterpriseServices
Imports System.Reflection

'********************************************
'COM+ 등록 정보

'COM+ 응용 프로그램 이름 제공
<Assembly: ApplicationNameAttribute("ComPlusExample")>

'강력한 이름 어셈블리 제공
<Assembly: _
AssemblyKeyFileAttribute("bin/ComPlusExample.snk")>
'********************************************

<TransactionAttribute(TransactionOption.Required)> _
Public Class COMPlusServices
Inherits ServicedComponent

Public Sub New()
MyBase.New()
End Sub

<AutoComplete()> Public Function DoTransaction() _
As String
Return "성공적인 COM+"
End Function
End Class

이 코드는 몇 개의 네임스페이스를 가져와서 시작되어 구성 요소를 선언할 때 입력한 내용의 일부를 제거합니다.

다음은 COM+ 등록 정보입니다. 다음과 같은 코드 줄을 입력합니다.
'COM+ 응용 프로그램 이름 제공
<Assembly: ApplicationNameAttribute("ComPlusExample")>

이 코드 줄은 ComPlusExample의 값인 ApplicationNameAttribute를 할당합니다. 이것은 COM+ 응용 프로그램이 COM+ 카탈로그에 등록될 때 이 응용 프로그램의 이름이 됩니다. 이 구성 요소가 처음으로 호출된 후 MMC 스냅인의 COM+ 응용 프로그램 폴더로 이동하면 이 응용 프로그램의 이름을 볼 수 있습니다.

다음 코드 부분은 AssemblyKeyFileAttribute 특성을 선언합니다.

<Assembly: _
AssemblyKeyFileAttribute("bin/ComPlusExample.snk")>

이것은 강력한 이름에 대한 정보가 있는 위치를 COM+ 카탈로그에 알립니다. 나중 단계에서 .SNK 파일을 만들게 되지만 이것은 COM+에 대한 구성 요소를 설명하는 파일입니다.

다음 코드를 사용하여 클래스 이름 COMPlusServices를 선언합니다.

<TransactionAttribute(TransactionOption.Required)> _
Public Public Class COMPlusServices

이 클래스 이름 앞에 있는 특성은 개발자가 트랜잭션 특성을 Required로 설정하기 원한다는 것을 COM+에게 알립니다. 그림 1에 표시된 것과 같이 이 코드 줄을 추가하는 것은 COM+ 응용 프로그램 스냅인으로 이동하여 이 특성을 수동으로 설정하는 것과 같습니다.

클래스의 다음 코드 줄은 System.EnterpriseServices 네임스페이스의 ServicedComponent로부터 상속된 것입니다.

Inherits ServicedComponent

이 코드 줄을 포함시키지 않으면 COM+에서 이 구성 요소를 사용할 수 없습니다.

트랜잭션 메서드 추가

이 클래스 설정이 완료되었으므로 실제로 작동할 메서드를 만들 수 있습니다. 코드에 작성한 DoTransaction 함수는 단일 값을 반환하지만 트랜잭션에 참여하는 메서드에 사용해야 할 구문을 표시합니다.

<AutoComplete()> Public Function DoTransaction() As String
Return "성공적인 COM+"
End Function

이 메서드에 <AutoComplete()> 특성을 접두사로 사용해야 합니다. 이 메서드에 예외가 없는 한 해당 메서드가 완료되면 SetComplete가 자동으로 호출되는 것을 의미합니다. 메서드에 예외가 있으면 .NET 런타임이 SetAbort method 메서드를 자동으로 호출합니다. 이것은 Visual Basic 6.0으로 COM 구성 요소를 작성할 때 SetComplete 및 SetAbort를 명시적으로 직접 호출해야 하는 것과는 차이가 있습니다.

강력한 이름 만들기

구성 요소를 컴파일하기 전에 이 구성 요소에 대한 어셈블리에 강력한 이름을 지정해야 합니다. 이렇게 하지 않으면 COM+ 카탈로그가 구성 요소를 인식하지 못하여 구성 요소를 등록할 수 없습니다. 실제로 이 작업은 이전에 사용한 AssemblyKeyFile 특성을 통해 이미 실행했으나, 이제 강력한 이름을 만들고 강력한 이름 도구(Sn.exe)를 사용하여 GUID와 어셈블리를 연결해야 합니다.

명령 프롬프트를 엽니다.

강력한 이름을 만들려면 명령 프롬프트에 다음을 입력한 다음 Enter를 누르십시오.
sn -k ComPlusExample.snk

ComPlusExample.snk 파일을 하드 드라이브(대부분 C:/)의 루트 폴더에서 프로젝트가 있는 폴더 아래의 bin 디렉터리에 복사합니다.

그런 다음 이 프로그램을 컴파일하여 이 구성 요소를 COM+에 등록하는 데 필요한 파일을 빌드할 수 있습니다. Visual Studio .NET에서 빌드 메뉴의 빌드를 클릭하십시오.

클라이언트 테스트 응용 프로그램 작성

구성 요소가 작성되었으므로 클라이언트 응용 프로그램을 작성하여 이 구성 요소를 호출하고 구성 요소를 테스트해야 합니다. 모듈 파일의 Main 메서드가 새 구성 요소의 인스턴스를 만드는 간단한 콘솔 응용 프로그램을 만든 다음 DoTransaction() 메서드를 호출합니다. 다음을 실행합니다.

Visual Basic .NET에서 새 콘솔 응용 프로그램 프로젝트를 만듭니다.

이 구성 요소에 참조를 추가합니다.

다음 코드를 입력합니다.
Module modMain
Sub Main()
Dim objCOMPlus As New _
COMPlusJumpStart.COMPlusServices()

Console.WriteLine(objCOMPlus.DoTransaction)
Console.ReadLine()
End Sub
End Module

확인

이제 이 응용 프로그램을 실행할 수 있습니다.

구성 요소 서비스 MMC 스냅인을 열고 구성 요소가 COM+ 카탈로그에 동적으로 등록되었는지 확인합니다. 그림 2와 같이 나타납니다.

콘솔 응용 프로그램을 컴파일하고 실행합니다.

그림 2. COM+ 카탈로그의 새로운 .NET 공급 구성 요소

역할 기반 보안

여러 사용자가 COM+에서 실행되는 COM 구성 요소를 호출하도록 하려면 지정된 사용자만 특정 구성 요소에 액세스하도록 해야 합니다. COM+을 사용하여 역할을 정의하고 NT 사용자를 해당 역할에 할당할 수 있습니다. 이러한 역할이 정의되면 어떤 구성 요소에서 어떤 역할이 실행될지 할당할 수 있을 뿐만 아니라 이 구성 요소의 어떤 메서드가 실행될지도 할당할 수 있습니다.

역할 기반 보안을 포함하도록 동일한 COMPlusServices 클래스에 메서드를 추가해 봅니다. Managers라고 하는 역할을 만들어 이 새 메서드에서 Managers 역할에 호출자가 있는지 테스트합니다.

역할 기반 보안 추가 단계

보안 역할을 추가하기 위해 구성 요소 서비스 MMC 스냅인에서 COM+ 응용 프로그램을 직접 수정하는 대신 프로젝트에 새 특성을 추가합니다. SecurityRoleAttribute 클래스를 사용하여 새 Managers 역할을 추가합니다. 이 클래스의 생성자에는 role(문자열)과 everyone(부울)의 두 가지 인수가 있습니다. role 인수는 만들 역할의 이름을 지정하고 everyone 인수는 기본으로 제공되는 Everyone 그룹이 역할의 사용자에 추가되는지 여부를 지정합니다.

다음 코드에 아래의 주석 COM+ 등록 정보를 입력하여 COM+ 응용 프로그램에 새 보안 역할을 추가합니다.
'********************************************
'COM+ 등록 정보

'역할 기반 보안 특성
<Assembly: SecurityRoleAttribute("Managers", False)>

보안 수준 설정을 변경하여 프로세스 및 구성 요소 수준에서 액세스 검사를 실행합니다. 이렇게 하면 COM+ 응용 프로그램이 보안 호출 컨텍스트를 가질 수 있습니다.

COM+ 서비스 스냅인을 표시합니다.

그림 3과 같이 보안 탭을 클릭하여 보안 수준을 변경합니다.

그림 3. COM+ 카탈로그의 보안 수준 속성 설정

수동으로 처리하는 대신 액세스 수준 검사를 실행하도록 알려주는 특성을 구성 요소에 추가할 수 있습니다. 다음은 COMPlusServices 클래스 상단에 있는 COM+ 등록 정보 섹션 내에 추가되는 코드입니다.

<Assembly: ApplicationAccessControlAttribute
(AccessChecksLevel:=AccessChecksLevelOption.ApplicationComponent)>

보안 역할 확인

IsManager라고 하는 클래스에 새 메서드를 추가합니다. 이 메서드는 사용자가 Managers 역할의 구성원인지를 확인합니다. 이 메서드는 함수로서 호출자가 Managers 역할의 일부인지를 나타내는 부울 값을 반환합니다. 메서드를 호출하는 사용자의 보안 컨텍스트에 액세스하기 위해서는 SecurityCallContext 클래스를 사용해야 합니다. CurrrentCall 메서드를 호출하여 현재 호출자의 컨텍스트를 얻을 수 있습니다. 그런 다음, IsCallerInRole 메서드를 호출하여 이름이 Managers인 역할에 전달합니다.

아래와 같이 해당 메서드를 COMPlusServices 클래스에 추가합니다.
Public Function IsManager() As Boolean

Dim objCallContext As SecurityCallContext = _
SecurityCallContext.CurrentCall

IsManager = _
objCallContext.IsCallerInRole("Managers")

End Function

구성 요소를 다시 작성하여 이 새 메서드를 확인해야 합니다.

Visual Studio .NET에서 빌드 메뉴의 솔루션 다시 빌드를 클릭하십시오.

확인

콘솔 클라이언트 응용 프로그램의 Sub Main() 메서드에서 코드를 수정합니다. 해당 코드는 다음과 같습니다.
Sub Main()

Dim objCOMPlus As New _
COMPlusJumpStart.COMPlusServices()

Console.WriteLine(objCOMPlus.DoTransaction)
Console.WriteLine(objCOMPlus.IsManager().ToString)
Console.ReadLine()

End Sub

컴파일한 실행 파일의 이름을 입력하여 명령 프롬프트에서 콘솔 응용 프로그램을 실행합니다.

코드를 처음 실행할 때, Managers 역할에 추가된 사용자가 없기 때문에 액세스가 거부되었다는 예외 구문이 표시됩니다. 이 문제를 해결하려면 자신을 Managers의 사용자로 추가하고 응용 프로그램을 다시 시작합니다. 이 경우 예외가 표시되지 말아야 합니다. 코드에 예외 처리를 추가할 수도 있습니다. 다음은 예외 처리 코드를 추가한 클라이언트입니다.

Sub Main()

Try

Dim objCOMPlus As New _
COMPlusJumpStart.COMPlusServices()

Console.WriteLine(objCOMPlus.DoTransaction)
Console.WriteLine(objCOMPlus.IsManager().ToString)
Console.ReadLine()

Catch objException As Exception
Console.WriteLine("오류가 발생했습니다. " _
& "세부 정보: " _
& objException.Message)
Console.ReadLine()

End Try

End Sub

대기 중인 구성 요소 사용

COM+ 응용 프로그램에서 대기열 지원을 추가하는 것은 쉽습니다. 해당 응용 프로그램이 서버 응용 프로그램(독립 프로세스)으로 실행되도록 한 다음 대기열 탭에서 대기 및 수신 대기 속성을 설정해야 합니다. 설정이 완료되면 클라이언트 응용 프로그램이 구성 요소를 동기 또는 비동기적으로 호출할 수 있습니다. 이 기능의 장점은 COM 개체의 코드를 변경할 필요없이 COM+ 카탈로그의 해당 속성만 변경해도 된다는 것입니다.

.NET Framework는 대기 중인 구성 요소를 지원하기 때문에 COM+ 카탈로그를 수동으로 변경하는 대신 특성을 사용하여 구성 요소에 대기열 지원을 제공할 수 있습니다.

COMPlusServices 클래스에 메서드를 추가하고 .NET 클라이언트 응용 프로그램의 COM+ 대기 중인 구성 요소를 사용하여 메서드를 비동기적으로 호출합니다.

COM+ 응용 프로그램을 서버 응용 프로그램으로 만듭니다(독립 프로세스). 이것은 대기 중인 구성 요소의 요구 사항입니다. 특성을 통해 이 작업을 실행하려면 다음 코드를 프로젝트에 추가하십시오.
'********************************************
'COM+ 등록 정보

<Assembly: ApplicationActivationAttribute(ActivationOption.Server)>

구성 요소에 대기열 지원을 추가합니다. 대기열 지원이 MSMQ 대기열에 액세스할 수 있도록 하고 자체 대기열을 수신하도록 만들어 메시지를 처리하도록 합니다. 다음은 특성을 통해 이 작업을 실행하는 코드입니다.
'********************************************
'COM+ 등록 정보

<Assembly: ApplicationQueuingAttribute(Enabled:=True,
QueueListenerEnabled:=True)>

QueueTest라고 하는 메서드를 클래스에 추가합니다. 이것은 서브루틴이 되어야 하며, 반환 값을 가질 수 없습니다. 이를 통해 Windows 응용 프로그램 로그에 메시지가 작성됩니다. 해당 코드는 다음과 같습니다.
Public Sub QueueTest()
System.Diagnostics.EventLog.WriteEntry(_
"COMPlusServces", "대기열 테스트", _
Diagnostics.EventLogEntryType.Error)
End Sub

지금까지 사용자의 구성 요소를 COM+ 대기 중인 구성 요소를 만드는 작업을 실행했습니다.

확인

다른 콘솔 응용 프로그램을 만들고 이 구성 요소를 호출하여 대기 중인 구성 요소를 확인해야 합니다.

새 콘솔 응용 프로그램을 만듭니다.

이 콘솔 응용 프로그램의 Sub Main 프로시저에 다음 코드를 추가합니다.
Sub Main()
Dim objTest As COMPlusJumpStart.COMPlusServices
Dim strMoniker

strMoniker = _
"queue:/new:COMPlusJumpStart.COMPlusServices"
objTest = GetObject(strMoniker)
objTest.QueueTest()
End Sub

이로써 구성 요소의 QueueTest 메서드가 비동기적으로 호출됩니다. 메서드를 동기적으로 호출하려면 구성 요소의 다른 모든 메서드를 호출하는 방법으로 호출해야 합니다.

이제 이 콘솔 응용 프로그램을 실행하여 대기 중인 구성 요소를 확인할 수 있습니다.

Visual Basic 6.0 이후 버전의 COM+과의 차이

.NET에서와 마찬가지로 Visual Basic 6.0 또는 COM에 대해서는 이미 많이 알고 있을 것입니다. 그러나 .NET Framework를 사용하면 최소한의 코딩과 유지 관리로 개체를 연속적으로 상호 작용할 수 있습니다.

Visual Basic 6.0에서는 SetComplete 및 SetAbort를 명시적으로 직접 호출해야 했습니다. .NET에서는 <AutoComplete()> 특성에 의해 SetComplete 및 SetAbort가 호출됩니다.

Visual Basic .NET와 Visual Basic 6.0과의 또 다른 차이점은 Visual Basic 6.0 구성 요소는 STA(Single Threaded Apartment) 스레딩 모델을 사용하기 때문에 COM+ 개체 풀링을 사용할 수 없다는 것입니다. Visual Basic .NET 구성 요소는 .NET 구성 요소로서 모든 아파트 스레딩 모델을 지원하므로 COM+ 개체 풀링을 사용할 수 있습니다.

요약

.NET Framework를 사용하면 COM+이 제공하는 서비스를 쉽게 활용할 수 있습니다. 즉, 새로운 .NET 구성 요소를 COM과 COM+로 작성된 기존 응용 프로그램에 추가하여 함께 작업할 수 있습니다. 이것은 기존의 모든 COM 및 COM+ 코드를 사용할 수 있기 때문에 매우 중요합니다. 새 응용 프로그램을 처음부터 작성하는 경우에는 효율성이 뛰어나므로 이 응용 프로그램을 .NET Framework에서 작성할 것을 권장합니다.

저자 소개

Tim McCarthy(MCSD, MCT)는 InterKnowlogy의 대표 엔지니어로서 Microsoft의 최신 기술을 활용한 다중 계층 응용 프로그램을 설계하고 작성했습니다. 그는 DevDays에서 정기적으로 강연하며 최근에는 MSDN Field Content Team의 .NET 교육 컨텐트를 완성했습니다. Tim은 Wrox Press의 여러 책에 글을 저술했으며 최근 기사로는 "Professional VB.NET"가 있습니다. 또한 "SQL Server Magazine"의 Developer DotNET Update 뉴스레터에 여러 기사를 썼습니다.

Paul D. Sheriff는 남부 캘리포니아의 고객 소프트웨어 개발 및 컨설팅 회사인 PDSA, Inc의 소유자입니다. Paul은 남부 캘리포니아의 MSDN 지국장으로 "Paul Sheriff Teaches Visual Basic"이라는 Visual Basic 6 책의 저자이며 Keystone Learning Systems의 Visual Basic, SQL Server, .NET 및 Web 개발에 대한 72개 이상의 비디오를 제작했습니다. Paul은 Ken Getz와 공저한 "ASP.NET Jumpstart"라는 제목의 책을 SAMS를 통해 곧 발간할 예정입니다. 자세한 내용은 PDSA, Inc. 웹 사이트(www.pdsa.com)를 방문하십시오.

Informant Communications Group

Informant Communications Group, Inc.(www.informant.com)은 정보 기술 분야를 전문으로 하는 세분화된 미디어 기업입니다. 1990년에 설립된 ICG는 소프트웨어 개발 발행물, 회의, 카탈로그 간행 및 웹 사이트를 전문적으로 다루고 있습니다. ICG는 미국과 영국에 각각 그 사무실을 두고 있으며 우수한 기술 정보를 찾는 IT 전문가의 요구에 부응하면서 존경받는 미디어 및 마케팅 컨텐트 통합자로서의 역할을 수행해 왔습니다.

Copyright © 2002 Informant Communications Group 및 Microsoft Corporation

기술 편집: PDSA, Inc.

화면 맨 위로

최종 수정일: 2002년 4월 19일