"Hello World" 관리되는 스마트 문서
안내
John R. Durant Microsoft Corporation
적용 대상: Microsoft Office Word 2003 Microsoft
Office Excel 2003 Microsoft Office System
요약: 이 문서에서는 스마트 문서 기술을 개괄적으로 설명하고 스마트 문서 솔루션을 작성, 배포 및 사용하는
단계에 대해 설명합니다. 스마트 문서 개발 과정의 모든 필수적 단계를 살펴보고 더욱 복잡한 솔루션 개발에 도움이 될 기술적 기초를
설명합니다(28페이지/인쇄 기준).
참고 이 문서에서는 독자가 Microsoft .NET 개발 및 배포에 관한 실무적
지식을 갖추고 있는 것으로 가정합니다.
목차
스마트 문서 개념에 대한
개요 프로젝트 생성 스마트 문서 컨트롤 추가 컨트롤 채우기 및 사용 솔루션 배포 및 사용 관리되는 스마트 문서 DLL
디버깅 결론
지난 몇 주 동안 많은 사람들이 저에게 기본적인 스마트 문서 솔루션의 작성과 실행 방법을 문의해 왔습니다. 스마트 문서의 진정한 가치,
개발 지침, 최선의 보안 관행 등 스마트 문서에 관해서는 지금까지 많은 언급이 있어 왔고 앞으로도 다른 곳에서 많이 다루어질 것입니다. 그러나
이번 달 칼럼에서는 스마트 문서 작성 방법에 대해 완전히 처음부터 설명하고자 합니다. 이번 칼럼이 다소 길기는 하지만 저는 처음부터 끝까지의
모든 작성 과정을 다루고자 했습니다. 무엇을 포함시키고 무엇을 제외할 것인지 판단하기가 쉽지 않았지만 최종 결과가 여러분에게 스마트 문서를 처음
작성하는 데 충분한 지침이 되고 더 자세한 것을 알고 싶도록 하는 계기가 될 수 있기를 기원합니다.
스마트 문서 개념에 대한
개요
스마트 문서는 XML 스키마와 연결되어 문서의 데이터가 단지 단락이나 일련의 셀이 아니라 특별한 의미를 갖는 Microsoft Office
Word 2003의 문서 또는 Microsoft Office Excel 2003의 통합 문서입니다. 예를 들어 어떤 단락이 해당 문서에서 두
번째 단락이라는 것을 아는 것보다 그 단락이 제품 설명을 담게 될 단락이라는 것을 아는 것이 훨씬 더 중요할 것입니다. 나아가, 그 단락이
제품에 관한 자세한 설명을 담을 것이라는 것을 알게 됨으로써 호스트 응용 프로그램은 다음 종류의 작업을 수행할 수 있습니다.:
- 제품 설명의 길이 제한
- 제품 설명을 추가할 때 사용자를 위한 도움말 추가
- 설명에 흔히 사용되는 문구를 담은 드롭다운 목록이 있는 인터페이스 제공
- 필요한 데이터 추가를 무시한 경우 사용자에게 알림
- 확인란 또는 옵션 단추가 있는 인터페이스를 제공하여 이를 선택하면 해당 단락에 텍스트를 자동으로 채울 수 있도록 함
스마트 문서는 문서 또는 통합 문서의 데이터에 호스트 응용 프로그램이 더 빠르게 반응하도록 만드는 하나의 방식을 제공하며, 데이터가 호스트
응용 프로그램에 의미를 갖도록 도와 줍니다. 이렇게 해서 Word 또는 Excel 등과 같은 응용 프로그램은 기능이 풍부한 응용
프로그램(이것만으로도 많은 설명이 필요)을 넘어서 사용자가 그 기능으로 무엇을 만들려고 하는지 전후 관계를 참조하여 인식할 수 있게 됩니다.
그림 1은 이 문서에서 만들 솔루션입니다.

그림 1. 예제 스마트 문서
스마트 문서 코드 작성은 복잡하지 않고 간단할 수도 있고, 또는 수천 줄의 코드로 구성되어 회사 전체로 범위가 확대될 수도 있습니다.
스마트 문서 솔루션은 VBA에서 작성할 수 없지만 Microsoft Visual Basic 6.0, Microsoft Visual Basic
.NET, Microsoft Visual C# .NET, 또는 Microsoft Visual C++ 개발 시스템을 사용하여 작성할 수 있습니다.
스마트 문서는 Microsoft SharePoint 제품 및 기술을 기반으로 하는 웹 사이트, 인터넷 또는 회사 인트라넷을 통해 배포할 수
있습니다.
스마트 문서의 기술적 측면에 관한 설명이 포함된 자세한 개요는 스마트 문서 베타 2 개발 개요 (US) 를 참조하십시오.
이 "Hello World" 스마트 문서를 개발하는 절차는 더 복잡한 스마트 문서 작성에 사용되는 절차와 동일합니다.:
- 스마트 문서 API를 사용하여 '문서 동작' 작업창과 작동하고 사용자 입력에 응답하는 DLL을 만듭니다.
- 스마트 문서 솔루션을 대상 문서에 연결하는 XML 확장 팩 매니페스트를 만듭니다. 솔루션을 연결하는 작업에는 대상 워크스테이션에 스키마
파일을 연결하고 DLL을 배포하는 작업이 포함됩니다.
프로젝트 생성
앞서 언급했듯이 이 프로젝트는 스마트 문서 솔루션 작성을 위해 C# 또는 Visual Basic .NET 등과 같은 .NET 호환 언어
또는 Visual Basic 6.0이 필요합니다. 이 문서의 예제에서는 Visual Studio .NET 2003에서 Visual Basic
.NET이 사용되었지만 다른 언어 및 Visual Studio .NET의 기존 버전도 사용할 수 있습니다.
참고이 프로젝트의 설치 프로그램은 시스템에 Microsoft Word
2003 및 Microsoft Smart Tags 2.0을 위한 .NET 프로그래밍 지원이 설치된 것으로 가정합니다. .NET 프로그래밍 지원이
설치되었다는 것은 대상 COM 라이브러리를 위한 기본 상호 운용성 어셈블리가 설치되었다는 것을 뜻합니다.
설치를 확인하려면 다음 레지스트리 키를 확인하십시오.
| 라이브러리 |
키 |
| Microsoft Office Word 2003 |
HKEY_CLASSES_ROOT\TypeLib\{00020905-0000-0000-C000-000000000046}\8.3 |
| Microsoft Smart Tags 2.0 |
HKEY_CLASSES_ROOT\TypeLib\{9B92EB61-CBC1-11D3-8C2D-00A0CC37B591}\1.2 |
이 키에서는 PrimaryInteropAssemblyName라는 문자열 값을 찾게 될 것입니다. 두 개의 COM 상호
운용성(Interop) 라이브러리에 해당하는 값에는 다음과 같이 PIA 네임스페이스와 버전이 포함되어야 합니다.
| 라이브러리 |
키 |
| Microsoft Office Word 2003 |
Microsoft.Office.Interop.Word,
Version=11.0.0.0 |
| Microsoft Smart Tags 2.0 |
Microsoft.Office.Interop.SmartTag,
Version=11.0.0.0 |
기본 상호 운용성 어셈블리가 설치되어 있지 않다면 Office 설치 프로그램을 실행하고 '추가' 또는 '제거' 기능을 선택하여 설치할 수
있습니다. 각 Office 응용 프로그램에는 .NET 프로그래밍 지원을 추가하는 옵션이 있습니다. 자세한 내용은 다음 문서를 참조하십시오.
다음 절차는 기본 프로젝트 구조를 만드는 과정을 안내합니다.
프로젝트를 만들려면
- Visual Studio .NET에서 프로젝트를 만들고 새 프로젝트 대화 상자(그림 2 참조)에서 클래스
라이브러리를 클릭하고 프로젝트 이름을 ProductInfo로 지정한 다음 확인을 클릭합니다.
그림 2. 새 프로젝트 대화 상자 사용
- 이 프로젝트에서 Microsoft Smart Tags 2.0 형식 라이브러리 및 Microsoft Word 11.0
개체 라이브러리에 대한 참조를 추가합니다. 다음과 같이 하십시오.
- 솔루션 탐색기에서 참조 를 마우스 오른쪽 단추로 클릭한 다음 참조 추가를 클릭합니다.
- COM을 클릭하고 Microsoft Smart Tags 2.0 형식 라이브러리를 두 번 클릭합니다.
-또는-
- 선택을 클릭하여 선택한 구성 요소 목록에 추가합니다.
- Microsoft Word 11.0 개체 라이브러리도 같은 방식입니다.
- 확인을 눌러 대화 상자를 닫습니다.
참고 이제 솔루션 탐색기 창의 참조 노드에 SmartTagLib 창이 표시되어야
합니다. 이를 강조 표시하고 속성 창을 보면 Copy Local 속성이 False로 설정되어 있어야
합니다. 그리고 Path 속성은 버전 번호: 11.0.0.0을 포함하여 전역 어셈블리 캐시(GAC)에서의 위치를 가리켜야 합니다.
예를 들면 다음과 같은 형태입니다.
C:\WINDOWS\assembly\GAC\Microsoft.Office.Interop.SmartTag\11.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.SmartTag.dll.
Word의 Copy Local 속성이 False일 뿐만 아니라 Path 속성 역시 GAC를 가리켜야
합니다.
- Microsoft Word 11.0 개체 라이브러리에 대한 참조를 추가합니다.
프로젝트를 만들면 Visual Studio .NET은 일반 클래스 파일, 클래스에 대한 정의를 담고 있는 Class1.vb,
Class1 등을 추가합니다. 이 이름은 일반적으로 사용자 지정 솔루션에 유용합니다. 그러므로 솔루션 탐색기 창에서 파일 이름을
ProductSD.vb로 바꾸고 클래스 이름을 ProductSmartDocument"으로 바꾸면 프로젝트 구조는 그림 3과 같이 됩니다.

그림 3. 스마트 문서 솔루션의 구조
또한 코드에서 긴 네임스페이스를 더 쉽게 사용할 수 있도록 코드 파일 시작 부분에 몇 줄의 Imports 문을 추가할 수
있습니다. ProductSD.vb 파일 내의 코드는 다음과 같은 형태여야 합니다. Imports Microsoft.Office.Interop.SmartTag
Imports Word = Microsoft.Office.Interop.Word
Public Class ProductSmartDocument
'Implementation code will go here
End Class
파일에 더 많은 코드를 추가하기 전에 먼저 그 코드에 포함되는 내용을 전체적으로 살펴보도록 합시다.
스마트 문서의 전체적 목적은 문서에서의 데이터 동작에 응답하는 컨트롤을 작업창에 배치하는 것이라는 것을 기억하십시오. 그러므로 스마트 문서
구성 요소에서 이루어지는 두 가지 주요 코드 작업은 각 데이터 요소에 어떤 컨트롤이 나타나야 하는지와 그러한 컨트롤이 사용될 때 어떤 작업을
해야 하는지를 지정하는 것입니다. 예를 들어 그림 4에서 삽입 포인터가 XML 구조의 노드 안에 있을 때(강조 표시된 텍스트에 유의)와 없을
때에 작업창이 어떻게 다른지 볼 수 있습니다. 삽입 포인터가 XML 구조의 유효한 노드 안에 있는 경우, 호스트 응용 프로그램은 이를 인식하여
컨트롤을 작업창에 표시합니다.

그림 4. 삽입 포인터가 XML 구조에 있는 노드 안에 있는 경우 호스트 응용 프로그램의 응답
사용자가 그림 5와 같은 작업창의 삽입 단추를 클릭하면 코드는 이 이벤트에 응답합니다. 이 경우, 코드는 목록 상자에서 선택된
텍스트만 추출하고 실제 문서에서 활성 XML 요소 내에 배치합니다.

그림 5. 제품 캡션 정보에 대한 요소가 선택된 경우 두 컨트롤을 보여주는 작업창
이 노드 ProductCaption의 경우 작업창에는 목록 상자와 단추 등 두 개의 컨트롤이 있다는 것을 알 수 있습니다. 이
목록 상자에는 4개의 항목이 있으며 사용자가 단추를 클릭하면 그 목록 상자의 텍스트가 문서로 삽입됩니다. 다른 노드에는 다른 컨트롤이 있으며 그
컨트롤들은 사용자의 동작에 따라 다르게 반응합니다. 따라서 목록 상자 대신 옵션 단추, 콤보 상자, 텍스트 상자 또는 사용자 지정
Microsoft ActiveX 컨트롤이 있을 수 있습니다. 다른 XML 노드의 코드는 그림 5의 컨트롤이 하는 것처럼 단순히 텍스트를 삽입하는
것이 아니라, 문서를 작성하거나 데이터베이스로 데이터를 내보내는 등 무한한 다양한 작업을 수행할 수 있습니다.
이 모든 것을 수행하는 코드는 크게 두 가지 범주로 분류할 수 있습니다.
- 컨트롤을 구성하여 이를 스키마의 XML 노드로 연결하는 코드
- 사용자가 컨트롤과 상호 작용할 때 반응하는 코드
스마트 문서 컨트롤 추가
먼저 코드를 살펴본 다음 컨트롤을 설정하여 이를 스크마의 노드와 연결할 것입니다. 스키마는 다음과 같습니다. < xml version="1.0" encoding="UTF-8" >
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="urn:schemas-microsoft-com.office11demos.WordProductsSD"
targetNamespace="urn:schemas-microsoft-
com.office11demos.WordProductsSD"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
id="ProductInfo">
<xsd:element name="ProductDescription" type="xsd:string"/>
<xsd:element name="ProductCaption" type="xsd:string"/>
<xsd:element name="ProductID" type="xsd:string"/>
</xsd:schema>
ProductInfo.xsd라는 명칭을 갖고 있으며 최종 솔루션 실행 파일과 동일한 디렉터리에 저장되는 이 스키마에는 문서의 문자열 값을
포함하는 세 가지 요소가 들어 있습니다. 각 요소는 다음 네임스페이스에 있습니다. urn:schemas-microsoft-com.office11demos.WordProductsSD
이 네임스페이스는 임의적으로 정의한 것이며 이것은 요소 이름과 함께 스마트 문서 DLL의 코드에서 사용됩니다. 이 스키마 파일은 DLL에서
실제로 포함되거나 명시적으로 참조되지 않지만 그 구조를 통해 코드의 디자인을 알 수는 있습니다. 실제로는 이러한 요소들은 스마트 문서 DLL
코드와 함께 정의된 형식이 되며, 문서의 데이터와 스마트 문서의 동작을 연결하는 주요 고리입니다.
ISmartDocument 구현
코드에서 가장 먼저 해야 할 것은 ISmartDocument 인터페이스에 대한 모든 인터페이스를 구현하는 것입니다. 이렇게
하려면 클래스 정의 내에 Implements ISmartDocument를 입력합니다. 구현된 인터페이스가
사용되지 않더라도 클래스에서 해당 인터페이스의 모든 구성원들이 구현되도록 해야 합니다. 구성원을 구현하려면 Visual Studio .NET의
Procedure 목록에서 각 구성원을 선택하고 클릭해야 합니다. 그러면 코드 창에 구성원이 추가됩니다. 각 프로시저 구현에 코드를 실제로
추가할 필요는 없습니다.
참고 Visual Studio .NET 2003은
Implements 키워드가 사용되는 경우 인터페이스의 모든 구성원에 대한 코드 스텁을 자동으로 추가하지만, Visual
Studio .NET 2002에서는 각 구성원을 명시적으로 선택하여 그 구현을 추가해야 합니다.
이러한 속성들과 메서드를 살펴보기 전에 클래스 정의의 시작 부분에 해당 구성원이 사용하는 몇 가지 선언을 추가합니다. Public Const BASEURI As String = _
"urn:schemas-microsoft-com.office11demos.WordProductsSD"
Public Const PRODUCT_DESC As String = BASEURI _
& "#ProductDescription"
Public Const PRODUCT_CAPTION As String = BASEURI _
& "#ProductCaption"
Public Const PRODUCT_ID As String = BASEURI _
& "#ProductID"
Public Const TYPESCOUNT As Integer = 3
Private ListBoxTextValue As String
첫 번째 상수 BASEURI는 앞에 나온 스키마에서 정의된 것과 동일합니다. 이것은 호스트 응용 프로그램에서 이루어지는
데이터의 작업을 스마트 문서 DLL의 배후 논리를 연결하기 때문에 중요합니다. 세 상수는 BASEURI 상수를 스키마에서 정의된 세
요소들과 매칭되는 고유 문자열과 연결함으로써 정의됩니다. TYPESCOUNT 상수는 얼마나 많은 수의 형식을 고려해야 하는지 스마트
문서 개체 모델에 알려 주기 위해 나중에 사용됩니다. 마지막 상수는 컨트롤을 통한 작업에 응답하는 데 사용되는 것으로서 여기서는 설명할 필요가
없습니다.
스마트 문서 개체 모델이 여러 사항들을 설정하는 데 사용하는 속성들은 특정한 순서로 사용됩니다.
SmartDocXmlTypeCount 속성이 가장 먼저 액세스되는데 이 속성은 컨트롤과 연결되는 네임스페이스의 요소 수를
결정합니다. 이 예제에서는 모든 요소에 컨트롤이 할당되어 있으나 다른 경우에도 항상 그런 것은 아닙니다. Public ReadOnly Property SmartDocXmlTypeCount() As Integer Implements _
Microsoft.Office.Interop.SmartTag.ISmartDocument.SmartDocXmlTypeCount
Get
Return TYPESCOUNT
End Get
End Property
이 예제의 경우 속성은 단순히 이전에 정의한 TYPESCOUNT 상수의 값을 반환합니다. 개체 모델은 요소가 세 개라는 것을
알고 있으므로 다음 속성인 SmartDocXmlTypeName을 세 차례 액세스합니다.
SmartDocXmlTypeName 속성은 정수로 전달되는 매개 변수 XMLTypeID를 가집니다. 이 매개
변수는 스마트 문서 개체 모델이 관리해야 하는 각 형식에 할당하는 숫자입니다. 이 예제에서는SmartDocXmlTypeCount가
세 개의 형식이 존재한다고 지정했기 때문에 이 속성이 세 차례 호출됩니다 처음 호출될 때는 1이 이 매개 변수의 값입니다. 두 번째는 값이
2이며 세 번째는 3입니다. Public ReadOnly Property SmartDocXmlTypeName(ByVal XMLTypeID _
As Integer) As String Implements _
Microsoft.Office.Interop.SmartTag.ISmartDocument.SmartDocXmlTypeName
Get
Select Case XMLTypeID
Case 1
Return PRODUCT_DESC
Case 2
Return PRODUCT_CAPTION
Case 3
Return PRODUCT_ID
End Select
Exit Property
End Get
End Property
이 코드가 어떻게 각 숫자에 대해 실제 요소 또는 형식 이름을 담은 문자열을 반환하는지 눈여겨 보십시오.
PRODUCT_DESC가 숫자 1에 연결되는 이유는 미리 알 수 없습니다. 숫자와 형식 간의 연결은 임의적입니다. 개체 모델은
순서를 중요하게 여기지 않기 때문에 반환되는 요소 형식의 순서는 쉽게 변경할 수 있습니다. 이 모델이 알아야 할 것은 고유한 내부 추적
번호(할당되는 정수)와 연결해야 하는 형식이 무엇인지 아는 것입니다.
액세스되는 다음 속성은 SmartDocXmlTypeCaption 속성입니다. 이 속성 또한 스마트 문서 개체 모델이 형식에
할당한 정수가 그 값인 매개 변수를 갖고 있습니다. 이 예제에서도 형식이 세 개이므로 이 속성 또한 세 차례 액세스됩니다. Public ReadOnly Property SmartDocXmlTypeCaption(ByVal XMLTypeID As _
Integer, ByVal LocaleID As Integer) As String Implements _
Microsoft.Office.Interop.SmartTag.ISmartDocument.SmartDocXmlTypeCaption
Get
Select Case XMLTypeID
Case 1
Return "Product Description"
Case 2
Return "Product Caption"
Case 3
Return "Product ID"
End Select
End Get
End Property
여기서는 숫자와 반환된 문자열 간의 연결이 임의적이지 않습니다. 숫자에 대한 캡션은 SmartDocXmlTypeName 속성의
동일한 숫자와 연결된 형식에 대해 의미가 있어야 합니다. 숫자 1이 해당 속성의 PRODUCT_DESC 상수와 연결되므로 캡션에 대한 제품
설명과 관련된 문자열을 반환하는 것이 합당합니다. SmartDocXmlTypeName 속성에서 항목 순서가 지정되고 나면 코드의
나머지 부분에서 일관되게 지켜져야 합니다.
다음으로 액세스되는 속성은 ControlCount 속성입니다. 형식의 고유한 이름으로 식별되는 각 요소에 대해 이 속성은 대상
형식이 작동될 때 사용할 실제 컨트롤의 수를 반환합니다. Public ReadOnly Property ControlCount(ByVal XMLTypeName As String) _
As Integer Implements _
Microsoft.Office.Interop.SmartTag.ISmartDocument.ControlCount
Get
Select Case XMLTypeName
Case PRODUCT_DESC
Return 3
Case PRODUCT_CAPTION
Return 2
Case PRODUCT_ID
Return 3
Case Else
Return 0
End Select
End Get
End Property
예를 들어 그림 6의 작업창에는
ProductCaption 요소를 위한 두 개의 컨트롤이 나타나 있습니다. 사용되는 형식은 urn:schemas-microsoft-com.office11demos.WordProductsSD#ProductCaption입니다.
따라서 이 속성은 이 형식에 대해 두 개의 컨트롤이 사용된다는 것을 지정합니다.
작업창에서 사용되는 각 컨트롤은 호스트 응용 프로그램 자체에서 액세스될 수 있는 고유한 식별자를 가져야 합니다. 앞에서 사용한 고유한
정수는 다른 형식을 내부적으로 추적하기 위해 스마트 문서 개체 모델이 사용하는 정수에 불과하므로 충분하지 않을 것입니다.
ControlID 속성을 사용하면 고유한 번호를 작업창의 컨트롤에 할당하여 나중에 코드에서 사용할 수 있습니다. 이것은 스마트
문서를 작업할 때 이해하기 가장 어려운 것 중 하나임이 분명하므로, 여기에서는 ControlID 속성 사용에 대해 자세히
설명하겠습니다.
고유의 사용자 정의 이름을 지정해야 하는 이유는 이 속성이 호출되고 형식 이름이 전달되면 스마트 문서 개체 모델이 각 형식에 대해서 컨트롤
번호를 1로 되돌리기 때문입니다. 따라서 첫 번째 형식에 대한 세 컨트롤(단추, 텍스트 상자 또는 목록 상자, 등등)의 번호는 1, 2, 3이
될 것입니다. 그런데 두 번째 형식에도 세 개의 컨트롤이 할당된 경우 기본적으로 각 형식에 대해 시작점이 재설정되기 때문에 이러한 컨트롤의
번호도 1, 2, 3이 됩니다. 조건부 논리를 ControlID 속성에 추가하면 번호 체계를 제어할 수 있습니다. Public ReadOnly Property ControlID(ByVal XMLTypeName As String, _
ByVal ControlIndex As Integer) As Integer Implements _
Microsoft.Office.Interop.SmartTag.ISmartDocument.ControlID
Get
Select Case XMLTypeName
Case PRODUCT_DESC
Return ControlIndex
Case PRODUCT_CAPTION
Return ControlIndex + 100
Case PRODUCT_ID
Return ControlIndex + 200
Case Else
Return 0
End Select
End Get
End Property
이 코드에서 첫 번째 형식은 기본 시작 지점 1을 사용하며 이것은 ControlIndex 매개 변수의 값입니다. 두 번째
형식은 시작 지점 1을 사용하며 100을 추가합니다. 세 번째 형식은 같은 시작 지점을 사용하지만 200을 추가합니다. 이렇게 하면 각 형식은
100개의 컨트롤을 할당하게 됩니다. 이것은 실질적으로 사용될 수 있는 숫자보다 훨씬 많은 숫자입니다.
다음으로 액세스되는 속성은 ControlNameFromID 속성입니다. 이 속성은 컨트롤에 할당된 번호를 매개 변수로
받습니다. 따라서 컨트롤이 PRODUCT_CAPTION 형식의 두 번째 컨트롤인 경우 그 번호는 102입니다. 이 속성은 단지 이
번호를 스키마의 네임스페이스에 추가하고 이를 반환합니다. Public ReadOnly Property ControlNameFromID _
(ByVal ControlID As Integer) As String Implements _
Microsoft.Office.Interop.SmartTag.ISmartDocument.ControlNameFromID
Get
Return BASEURI & ControlID.ToString
End Get
End Property
이 속성은 호스트 응용 프로그램에서 컨트롤의 번호를 액세스할 수 있도록 합니다. 따라서 번호 102와 연결된 컨트롤은 나중에 호스트 응용
프로그램의 개체 모델에서 참조될 수 있습니다.
이제 번호를 가진 각 컨트롤은 캡션을 포함합니다. 단추는 그 자체에 캡션을 가지며 텍스트 상자와 같은 컨트롤들은 대개 설명 레이블이 그
완쪽에 표시됩니다. 이러한 캡션들은 컨트롤에 할당된 번호에 따라 지정 및 반환되어야 합니다. 이 작업은
ControlCaptionFromID 속성을 사용하여 수행됩니다. Public ReadOnly Property ControlCaptionFromID _
(ByVal ControlID As Integer, ByVal ApplicationName As String, ByVal _
LocaleID As Integer, ByVal Text As String, ByVal Xml As String, _
ByVal Target As Object) As String Implements _
Microsoft.Office.Interop.SmartTag.ISmartDocument.ControlCaptionFromID
Get
Select Case ControlID
Case 1
Return "Desc List"
Case 2
Return "Description"
Case 3
Return "Insert"
Case 101
Return "Captions"
Case 102
Return "Insert"
Case 201
Return "Category"
Case 202
Return "Sub Category"
Case 203
Return "Insert"
End Select
End Get
End Property
이 속성은 컨트롤에 할당된 번호의 값을 매개 변수로 받습니다. 그 번호에 따라 적절한 캡션이 반환됩니다.
마지막으로, 형식이 작동될 때 어떤 종류의 컨트롤이 렌더링되어야 하는지를 개체 모델에 알려 주는 코드가 있어야 합니다. 예를 들어 그림 6에는 두 개의 컨트롤(목록 상자와 단추)이 나와
있습니다. 지금까지 코드는 단순히 두 개의 컨트롤이 ProductCaption 형식과 연결되어 있고 번호 101과 102이 할당된다는 것을
지정했을 뿐입니다. 이제 코드는 101이 목록 상자이고 102는 단추라는 것을 명확하게 나타내야 합니다. 이렇게 하려면
ControlTypeFromID 속성을 사용하여 다음과 같은 방식으로 수행합니다. Public ReadOnly Property ControlTypeFromID _
(ByVal ControlID As Integer, ByVal ApplicationName As String, _
ByVal LocaleID As Integer) _
As Microsoft.Office.Interop.SmartTag.C_TYPE Implements _
Microsoft.Office.Interop.SmartTag.ISmartDocument.ControlTypeFromID
Get
Select Case ControlID
Case 1
Return C_TYPE.C_TYPE_COMBO
Case 2
Return C_TYPE.C_TYPE_TEXTBOX
Case 3
Return C_TYPE.C_TYPE_BUTTON
Case 101
Return C_TYPE.C_TYPE_LISTBOX
Case 102
Return C_TYPE.C_TYPE_BUTTON
Case 201
Return C_TYPE.C_TYPE_COMBO
Case 202
Return C_TYPE.C_TYPE_COMBO
Case 203
Return C_TYPE.C_TYPE_BUTTON
End Select
End Get
End Property
참고 여기서 참조되고 있는 형식은 다양한 컨트롤에 대한 상수를
포함하고 있는 C_TYPE 열거에서 가져온 것으로서 이 문서의 코드에서 이 중 일부가 예제로 사용됩니다.
컨트롤 채우기 및 사용
사용할 형식, 이러한 형식에 할당되는 컨트롤 수, 그리고 사용할 컨트롤의 종류를 스마트 문서가 알게 되면 코드는 필요에 따라 컨트롤을
채우거나 초기 속성을 설정한 다음 사용자의 입력에 응답합니다.
초기 속성 채우기 및 설정
PopulateCheckbox, PopulateRadioGroup 또는 PopulateListOrComboContent 메서드와 같이
컨트롤을 채우기 위한 여러 메서드가 있습니다. 실제로는 훨씬 더 많은 메서드가 존재하지만 ControlTypeFromID 속성을
통해 DLL에서 사용하기로 지정한 컨트롤 형식에 해당하는 메서드만 사용하면 됩니다. 이 문서의 예제에서 사용하는 형식은 다음과
같습니다.
- C_TYPE_Combo
- C_TYPE_ListBox
- C_TYPE_TextBox
- C_TYPE_Button
목록의 처음 두 형식은 유사한 방식으로 동작하므로 실제로 하나의 메서드를 공유합니다. 그것들을 채우는 데 사용되는 메서드는
PopulateListOrComboContent 메서드입니다. 이 스마트 문서 코드는 이 메서드를 사용하는 네 개의 컨트롤을
지정하는 데 그 중 셋은 콤보 상자이며 하나는 목록 상자입니다. 이 메서드는 채우려는 컨트롤에 대한 식별자를 값으로 가지는 ControlID매개
변수를 받습니다. 조건부 논리를 메서드에 추가하면 고유 식별자에 따라 컨트롤을 다르게 채울 수 있습니다. Public Sub PopulateListOrComboContent _
(ByVal ControlID As Integer, ByVal ApplicationName As String, _
ByVal LocaleID As Integer, ByVal Text As String, _
ByVal Xml As String, ByVal Target As Object, ByVal Props As _
Microsoft.Office.Interop.SmartTag.ISmartDocProperties, _
ByRef List As System.Array, ByRef Count As Integer, ByRef _
InitialSelected As Integer) Implements _
Microsoft.Office.Interop.SmartTag.ISmartDocument. _
PopulateListOrComboContent
Select Case ControlID
Case 1
Count = 4
List(1) = "Description 1"
List(2) = "Description 2"
List(3) = "Description 3"
List(4) = "Description 4"
InitialSelected = 1
Case 101
Count = 4
List(1) = "Caption 1"
List(2) = "Caption 2"
List(3) = "Caption 3"
List(4) = "Caption 4"
InitialSelected = 1
Case 201
Count = 4
List(1) = "1000"
List(2) = "2000"
List(3) = "3000"
List(4) = "4000"
InitialSelected = 1
Case 202
Count = 4
List(1) = "AWC"
List(2) = "DXF"
List(3) = "GYI"
List(3) = "JZL"
InitialSelected = 1
End Select
End Sub
여기서는 단순화하기 위해 값을 하드 코딩했으나 반드시 이렇게 할 필요는 없습니다. 데이터베이스, XML 파일, 파일 공유, 웹서비스 또는
기타 데이터 소스를 액세스하여 목록의 항목들을 지정할 수 있습니다.
이 코드에서는 세 개의 다른 매개 변수를 사용합니다. 첫 번째는 Count 매개 변수입니다. 이것은 참조에 의해 전송되므로 메서드에서 매개
변수의 값을 설정하는 것은 호출 코드가 같은 값을 액세스할 수 있음을 의미한다는 점에 유의하십시오. 이 값은 작성하는 목록에 포함할 항목의 수를
개체 모델에 나타냅니다. 두 번째 매개 변수는 List입니다. 역시 참조에 의해 전달되는 이 매개 변수는 System.Array로서 컨트롤에
위치할 항목들의 목록을 담고 있습니다. 스마트 문서 개체 모델은 Microsoft Office 개발의 다른 개체 모델과의 일관성을 지하기 위해
1부터 시작하는 목록을 사용합니다. 따라서 .NET에서 System.Array 형식이 0부터 시작하더라도 사용하는 언어에 상관 없이 배열의 첫
번째 요소를 채워서는 안 됩니다. 목록을 채우고 난 후, 역시 참조에 의해 전달되는 InitialSelected 매개 변수는 목록의 첫째 항목이
선택되도록 1로 설정됩니다. 예제 코드는 설명을 위해 설계된 것입니다.
다른 컨트롤을 채우기 위해 이 코드에서는 PopulateOther 메서드를 사용합니다. 이 메서드를 통해 단추, 레이블, 링크
및 구분 기호 등과 같은 것들의 초기 속성을 설정할 수 있습니다. 이 코드는 이러한 메서드를 사용하여 세 단추의 속성을 설정합니다. Public Sub PopulateOther(ByVal ControlID As Integer, _
ByVal ApplicationName As String, ByVal LocaleID As Integer, _
ByVal Text As String, ByVal Xml As String, ByVal Target _
As Object, ByVal Props As _
Microsoft.Office.Interop.SmartTag.ISmartDocProperties) Implements _
Microsoft.Office.Interop.SmartTag.ISmartDocument.PopulateOther
Select Case ControlID
Case 3
Text = "Insert Description"
Case 102
Text = "Insert Caption"
Case 203
Text = "Insert ProductID"
End Select
End Sub
사용자 상호 작용에 응답
예제의 코드는 다섯 개의 단추(스키마에 정의된 각 컨트롤 형식에 대해 하나씩)를 포함하고 있습니다. 그 중 하나는 각 형식에 할당된 다른
컨트롤과 함께 표시됩니다. 사용자가 단추를 클릭하면 다른 컨트롤에서 가져온 값이 문서에서 구조의 활성 XML 노드 안에 추가됩니다. 이를
수행하기 위해 두 개의 메서드가 사용되며 그 중 하나가 InvokeControl 메서드입니다. Public Sub InvokeControl(ByVal ControlID As Integer, _
ByVal ApplicationName As String, ByVal Target As Object, _
ByVal Text As String, ByVal Xml As String, ByVal _
LocaleID As Integer) Implements _
Microsoft.Office.Interop.SmartTag.ISmartDocument.InvokeControl
Dim localRange As Word.Range
Dim insertText As String
localRange = CType(Target, Word.Range)
Select Case ControlID
Case 3
insertText = localRange.XMLNodes(1). _
SmartTag.SmartTagActions(2). _
TextboxText
Case 102
insertText = ListBoxTextValue
Case 203
insertText = localRange.XMLNodes(1). _
SmartTag.SmartTagActions(1). _
TextboxText
insertText = insertText & localRange.XMLNodes(1). _
SmartTag.SmartTagActions(2). _
TextboxText
End Select
localRange.XMLNodes(1).Text = insertText
End Sub
이이 메서드는 컨트롤을 채우거나 컨트롤 이벤트에 응답하기 위한 모든 메서드와 마찬가지로 컨트롤에 대한 숫자 식별자
ControlID를 받습니다. 이렇게 함으로써 코드는 이 메서드의 실행을 야기한 이벤트를 어떤 컨트롤이 받았는지 알게
됩니다.
또한 호스트 응용 프로그램에서 액세스되는 범위에 대한 참조인 매개 변수 Target을 받습니다. 이 예제는 이것을
Object 형식으로부터 실제 형식으로 변환합니다. Dim localRange As Word.Range
Dim insertText As String
localRange = CType(Target, Word.Range)
코드는 어느 컨트롤이 액세스되었는가에 따라 다른 논리를 갖습니다. 예를 들어, 제품 설명 정보가 표시 중일 때 클릭된 단추가 작업창에
있다면 그 숫자는 3이며 그 작업창(이 경우에는 텍스트 상자)의 두 번째 컨트롤의 값은 로컬 변수insertText로 할당됩니다. 그 변수의
값은 문서의 해당 범위로 삽입됩니다. 이 범위는 XML 구조의 XML 노드에 의해 표현되며 다음과 같은 방식으로 Range 개체의
XMLNodes 컬렉션을 통해 액세스됩니다: localRange.XMLNodes(1).Text =
insertText.
컨트롤에 대한 액세스 권한을 얻는 방법은 호스트 응용 프로그램의 Range 개체로부터 반환된 XMLNodes
컬렉션을 사용하는 것입니다. 첫째 노드를 액세스하여, 대상 범위를 정의하는 형식과 현재 연결된 컨트롤 목록을 반환하는
SmartTag.SmartTagActions 속성에 대한 참조를 얻을 수 있습니다. 제품 설명 정보가 표시되었을 때 사용자가
작업창에서 단추를 클릭했다면(그림 6 참조), 컨트롤이 참조되어 값을 추출하고 이를 문서에 배치할 수 있습니다. 앞서 정의했던
PRODUCT_DESC 형식과 연결된 컨트롤이 세 개인데 그 중 두 번째는 텍스트 상자이므로 다음과 같은 구문에 의해 해당 컨트롤의 텍스트 값을
액세스할 수 있습니다: localRange.XMLNodes(1).SmartTag.SmartTagActions(2).TextboxText.

그림 6. 제품 설명 정보 표시를 위한 작업창의
컨트롤
텍스트 상자의 값은 변수 안에 위치하며 Range 개체를 이용하여 문서에 추가됩니다.
제품 ID 정보가 표시되었을 때 클릭된 단추가 작업창에 있다면(그림 7 참조), 코드는 두 개의 문자열(첫째 콤보 상자에서 하나, 두 번째
콤보 상자에서 하나)을 검색하고 문서에 배치되기 전에 이들을 insertText 변수로 연결 및 할당합니다.

그림 7. 제품 ID 정보 표시를 위한 작업창의 컨트롤
제품 캡션 정보가 표시되었을 때 작업창에 클릭된 단추가 있다면(그림 6 참조), 전역 변수 ListBoxTextValue의
값이 로컬 insertText 변수에 할당되고 이어서 localRange 개체를 통해 문서에 배열됩니다.
ListBoxTextValue는 작업창에 있는 목록 상자의 선택된 항목이 변경될 때마다 값이 설정되는 전역 변수입니다. 이 목록
상자는 제품 캡션 정보가 표시될 때만 표시되며 스마트 문서 DLL 외부에서 선택된 값의 텍스트 값을 직접 액세스할 수 있는 방법은 없습니다.
따라서 선택된 항목이 변경되면 그 텍스트 값은 나중에 액세스될 수 있도록 전역 변수에서 설정됩니다. 선택된 항목이 변경될 때 전역 변수를
설정하는 코드는 다음과 같습니다. Public Sub OnListOrComboSelectChange(ByVal ControlID As Integer, _
ByVal Target As Object, ByVal Selected As Integer, _
ByVal Value As String) Implements _
Microsoft.Office.Interop.SmartTag. _
ISmartDocument.OnListOrComboSelectChange
Dim localRange As Word.Range
Dim insertText As String
localRange = CType(Target, Word.Range)
Select Case ControlID
Case 1
localRange.XMLNodes(1). _
SmartTag.SmartTagActions(2).TextboxText = Value
Case 101
ListBoxTextValue = Value
End Select
End Sub
이 메서드는 이전 것과 마찬가지로 문서의 대상 범위에 액세스하게 해주며 목록 상자 또는 콤보 상자의 선택된 항목이 변경될 때마다 메서드를
우선 설정합니다. 이 범위를 통해 이 범위를 현재 정의하고 있는 형식에 할당된 컨트롤에 액세스할 수 있습니다.
PRODUCT_CAPTION 형식과 연결된 XML 구조의 노드 안에 삽입 포인터가 있을 때 표시되는 목록 상자가 컨트롤이라면 그
컨트롤의 ID는 101입니다. 따라서 매개 변수로서 전송되는 목록 상자의 값 Value는 전역 변수에 할당됩니다. 다른 컨트롤 또한
이 메서드를 사용하는데 그것은 PRODUCT_DESC 형식에 할당된 콤보 상자입니다. 그 콤보 상자에서 선택된 항목이 변경되면 그
값은 작업창에 동시에 표시되는 텍스트 상자에 위치합니다.
솔루션 배포 및 사용
코드가 완료되면 이제 호스트 응용 프로그램에서 사용될 수 있도록 스마트 문서 DLL을 작성하고 배포합니다. 프로젝트를 작성하는 것은
쉽습니다. 빌드 메뉴에서 솔루션 빌드를 클릭합니다. 솔루션의 릴리스 버전을 명시하도록 해야 합니다. 구성
관리자(역시 빌드 메뉴에 있음)를 클릭하고 Release for the Active Solution
Configuration 을 선택합니다(그림 8 참조).

그림 8. 빌드 시 최종 릴리스 버전을 위한 프로젝트 설정
이렇게 하면 솔루션의 \BIN 디렉터리에 관리되는 DLL이 만들어집니다. RegAsm 유틸리티를 사용하여 어셈블리를 등록하거나 COM과의
상호 운용성을 위해 다른 조치를 취할 필요가 없습니다.
XML 확장 팩 매니페스트 파일 만들기
매니페스트 파일은 스마트 문서 솔루션의 로드 및 동작 방법을 지정하는 설정이 포함된 XML 파일입니다. 이 문서의 솔루션을 위한 매니페스트
파일의 내용은 다음과 같습니다. < xml version="1.0" encoding="UTF-8" standalone="no" >
<manifest xmlns=
"http://schemas.microsoft.com/office/xmlexpansionpacks/2003">
<version>1.0</version>
<updateFrequency>20160</updateFrequency>
<uri>urn:schemas-microsoft-com.office11demos.WordProductsSD</uri>
<solution>
<solutionID>{BDE88D2F-FA67-4890-A674-A2BEE936A1A4}</solutionID>
<type>smartDocument</type>
<alias lcid="1033">Product Info</alias>
<documentSpecific>False</documentSpecific>
<targetApplication>Word.Application.11</targetApplication>
<file>
<type>solutionActionHandler</type>
<version>1.0</version>
<filePath>ProductInfo.dll</filePath>
<CLSNAME>ProductInfo.ProductSmartDocument</CLSNAME>
<managed/>
<runFromServer>True</runFromServer>
</file>
</solution>
<solution>
<solutionID>schema</solutionID>
<type>schema</type>
<alias lcid="1033">Product Info</alias>
<file>
<type>schema</type>
<version>1.0</version>
<filePath>ProductInfo.xsd</filePath>
</file>
</solution>
</manifest>
이 파일의 모든 요소에 대한 자세한 내용은 이 문서 시작 부분에서 언급한 스마트 문서 베타 2 개발 개요 (US) 문서에 다룹니다. 스마트
문서 매니페스트를 위한 스키마를 준수하고 .XML 확장자로 끝나는 경우라면 원하는 이름을 매니페스트에 사용할 수 있습니다. 명확하게 하기 위해
manifest_Signed.xml 파일을 호출하고 솔루션의 \BIN 디렉터리에 배치할 수 있습니다.
현재 솔루션에서 특정한 설정을 가진 요소들을 자세히 살펴보면 <alias> 요소는
사용자에게 친숙한 이름(이 경우에는 Product Info)을 포함하고 있다는 것을 알 수 있습니다. 앞叿䉍/ ᠀젇 ࠅက흃.�⟞ȀĀÿ 一䁍 伀> 요소는 솔루션에 대한 전체 네임스페이스를 포함하고 있으며 이 네임스페이스는 스마트 문서
DLL에 정의된 네임스페이스와 일치합니다. <file> 요소는 스마트 문서 실행 파일을
포함하는 파일에 대한 설정을 포함합니다. 이 예제에서 매니페스트 파일은 DLL과 동일한 디렉터리에 있으므로 DLL의 이름으로 충분합니다.
관리되지 않는 스마트 문서 솔루션에는 <CLSNAME> 요소가 존재하지 않습니다(<CLSID> 요소로 대체되었기 때문). <CLSNAME> 요소는 관리되는 솔루션에만 사용되며 스마트 문서 DLL에 대한 완전히 검증된 클래스
이름 또는 Namespace.ClassName을 포함합니다. <managed/>
요소는 해당 솔루션이 관리되는 솔루션으로 지정하며 <runFromServer> 요소는 솔루션을
로드할 때 스마트 문서 DLL의 복사본을 사용자의 C:\Documents and Settings\ 디렉터리에 만들어야 하는지 여부를 결정하는
부울 값을 가집니다. 이 요소를 True로 설정하면 DLL은 로컬 디렉터리가 아니라 실제 위치에서 실행됩니다.
이 매니페스트 파일은 또한 스마트 문서 솔루션 로드 시에 호스트 응용 프로그램의 스키마 라이브러리로 대상 스키마를 가져오는 섹션을
포함합니다. 스키마 파일 ProductInfo.xsd가 매니페스트 파일과 동일한 디렉터리(이 경우, \BIN 디렉터리)에 있기 때문에 파일
이름을 파일 경로에 사용해도 괜찮습니다.
보안 구성
Visual Studio Tools for Office 로더라고 하는 COM 구성 요소 로더가 새로운 릴리스의
Microsoft Office System에 들어가 있습니다. 이 로더는 관리되는 스마트 문서 DLL과 관리되는 스마트 태그 DLL의 보안과
로딩을 처리합니다. Visual Studio Tools for Office 로더에 의해 로딩되는 관리되는 스마트 문서 DLL과
스마트 태그 DLL이 보안 점검 메커니즘을 사용하므로, Microsoft Office System의 일반적 보안 설정을 우회하고 더욱 엄격하지만
유연한 보안 요구 사항을 고수합니다. 궁극적으로 Visual Studio Tools for Office 로더의 보안은 .NET
Framework 보안에 의존하며 관리되는 DLL은 공용 언어 런타임(런타임)의 컨텍스트에서 실행됩니다. 따라서 Visual Studio
Tools for Office 로더의 보안은 다른 .NET 어셈블리와 마찬가지로 .NET Framework의 보안 정책과 설정을
따릅니다.
참고 >여기에서는 독자가 .NET Framework와 그 보안 방식을 숙지하고
있는 것으로 가정합니다.하지만 코드가 로딩 또는 실행되기 전에 런타임이 어셈블리를 조사하여 증거를 찾는다는 사실을 기억해 두면 유용할 것입니다.
그러한 증거를 바탕으로 런타임은 코드를 코드 그룹에 할당하고 그 코드 그룹은 그와 관련된 사용 권한을 갖습니다. 이러한 권한은 그 코드가 할 수
있는 작업, 실행 시기, 동작 방식 등을 결정합니다. "Visual Studio Tools for Office" 로더와 .NET 보안에 대한
자세한 사항은 스마트 태그 및 스마트 문서
SDK를 참조하십시오.
또한 스마트 문서 솔루션을 실행하는 Office 응용 프로그램은 XML 매니페스트가 디지털 서명이 없으면 스마트 문서 솔루션이 실행되도록
허용하지 않습니다. 이 프로세스는 코드의 출처와 인증을 확인하는 데 도움이 됩니다. 서명되어 있지 않으면 XML 확장 팩 매니페스트 파일은
호스트 응용 프로그램에서 실행되지 않으며, 이것은 설치되는 장소와 의도에 관계 없이 스마트 문서 솔루션 파일 중 어느 것도 메모리에 로딩되지
않는다는 것을 의미합니다.
.NET 보안과 XML 매니페스트 보안이 모두 구성되어야 하므로 .NET 관련 작업에서부터 시작하여 이 두 프로세스를 모두 살펴 볼
것입니다. 그러나 디지털 서명 및 관련 항목에 대한 자세한 내용은 스마트 태그 및 스마트 문서 SDK를
참조하기 바랍니다.
.NET 보안을 구성하려면 Microsoft 관리 콘솔 스냅인을 사용할 수 있습니다. 이 스냅인을 사용하려면 시작 메뉴에서
모든 프로그램, 관리 도구를 차례로 가리킨 다음 Microsoft .NET Framework 1.1
Configuration을 클릭합니다.
참고 버전 1.0 및 1.1의 Framework를 한 컴퓨터에 모두
설치한 경우에는 솔루션과 보안 설정이 같은 버전을 대상으로 하도록 해야 합니다. 달리 말해, 솔루션이 Framework 버전 1.1을 사용하는데
보안은 버전 1.0에서 구성한다면 스마트 문서가 올바로 로딩되지 않습니다.
콘솔 트리에서 Runtime Security Policy 노드를 확장한 다음 Machine 노드를 확장합니다.
여기서 솔루션에 새 코드 그룹을 정의하고, 로딩을 시도하는 솔루션의 파일 경로 또는 URL에 따라 보안을 구성할 것입니다. 이를 수행하려면
Code Groups 노드를 확장하고 All_Code를 확장한 다음 My_Computer_Zone을 마우스
오른쪽 단추로 클릭합니다. New를 클릭하여 다음 절차를 따라 새 코드 그룹을 만듭니다.
- Create Code Group 마법사 대화 상자에서 코드 그룹의 이름을 지정합니다.여기에서는
TrustProductInfo라고 지정한 다음 다음을 클릭합니다.
- Choose the condition type for this code group 목록에서 URL을 클릭합니다.
URL 텍스트 상자에서 다음 문자열을 지정합니다. file://C:/Projects/ProductInfo/* (그림 9 참조) 그리고
다음을 클릭합니다.
그림 9. .NET에서 솔루션을 위한 코드 그룹 속성 설정
솔루션을 다른 곳에 배치했다면 이 경로를 조정해야 합니다. 별표는 지정된 디렉터리 구조 아래의 어느 곳에서든지 로딩되는 모든 코드는 이
코드 그룹의 일부라는 것을 .NET에게 알려 줍니다.
- 다음 창에서는 이 코드 그룹에 어떤 종류의 권한이 부여되어야 하는지 .NET에 지정해야 합니다. 이 예제에서는 완전 신뢰를 부여합니다.
다음을 클릭한 다음 마침을 클릭합니다.
팁 배치 파일을 이용하여 이 프로세스를 자동화하면
.NET 보안 설정 추가 및 제거 작업을 보다 쉽게 할 수 있습니다.
XML 확장 팩을 위한 매니페스트 파일을 디지털 서명하려면 스마트 태그 및 스마트 문서 SDK에
제공되어 있는 XMLSign.exe 유틸리티를 이용하면 됩니다. 매니페스트를 서명하려면 다음 절차를 수행하십시오.
- XMLSign.exe를 시작합니다.
- XML 파일 상자 옆에 있는 찾아보기 단추(... )를 누릅니다(그림 10 참조).
그림 10. 매니페스트 파일 서명에 이용하는 XMLSign.exe 유틸리티
- 서명하려는 XML 확장 팩의 매니페스트 파일을 찾아서 클릭합니다.
- Open을 클릭합니다.
- Load XML를 클릭합니다.
- Stores 목록에서 사용할 인증서 저장소를 선택합니다.
- Certificate 목록에서, 호스트 응용 프로그램이 매니페스트를 로드하려고 시도할 때 그 인증을 확인하는 데 사용할
인증서를 선택합니다.
- XML 문서 트리 보기에서 manifest 노드를 마우스 오른쪽 단추로 클릭한 다음 Append
Signature를 클릭합니다.
- Sign XML 단추를 클릭합니다.
- File name 대화 상자에 제안된 이름인 <original name>_signed.xml이 나와 있을
것입니다. 이 이름을 사용하십시오.
- Save를 클릭합니다.
- OK를 클릭합니다.
서명된 버전의 매니페스트 파일인 <original name>_signed.xml이 처음에 만든 서명되지 않은 파일인
<original>.xml과 동일한 디렉터리에 만들어집니다.
XML 확장 팩 추가
보안을 적절하게 구성하고 서명된 매니페스트 파일이 갖춰지면 솔루션을 실행할 수 있습니다. 솔루션을 실행하기 전에 Word의 인스턴스가
실행되지 않도록 하십시오. Microsoft Office Outlook 2003의 전자 메일 편집기로 Word를 사용하고 있다면 Outlook도
종료해야 합니다. 그런 다음 Word를 시작하고 빈 문서를 하나 만드십시오.
- 도구 메뉴에서 서식 파일 및 추가 기능을 클릭합니다. 이 대화 상자가 나타나면 XML 확장 팩을 추가하고 스키마
라이브러리를 관리할 수 있습니다.
- XML 확장 팩을 클릭하고 추가 단추를 클릭합니다.
- manifest_Signed.xml 파일이 있는 디렉터리를 찾아가서 그 파일을 클릭하고 열기를 클릭합니다.
- XML 스키마를 클릭합니다. Product Info 스키마가 나열되어야 합니다.
- 확인을 눌러 대화 상자를 닫습니다.
이제 솔루션을 사용할 준비가 되었습니다. 작업창이 표시되어야 합니다. 문서에 요소를 추가해야 문서 동작 창에 내용이
표시됩니다. XML 구조 창을 열고 나타나는 요소 중 하나를 클릭하여 요소를 추가합니다. 원한다면 문서의 다른 위치에 있는 다른
요소를 추가할 수 있습니다. 원하는 요소를 추가했으면 문서 동작 창을 열고 XML 요소 내부에 삽입 포인터를 놓습니다. 솔루션에
미리 지정된 대로 컨트롤과 동작이 작업창에 표시됩니다.
관리되는 스마트 문서 DLL
디버깅
관리되는 스마트 문서 DLL 디버깅은 다양한 방식으로 수행될 수 있습니다. 이 솔루션은 가장 간단한 기법을 채택했습니다. 디버깅을
설정하려면, 솔루션의 릴리스 버전을 명시하도록 해야 합니다. 구성 관리자(빌드 메뉴에 있음)를 클릭하고 Debug
for the Active Solution Configuration을 클릭합니다. 이렇게 하면 솔루션의 \BIN 디렉터리에 관리되는
DLL의 디버그 버전이 만들어집니다.
또한 스마트 문서 DLL이 로딩되기 전에 호스트 응용 프로그램이 로딩되도록 프로젝트의 디버깅 속성을 설정해야 합니다. 이 속성을 설정하려면
솔루션 탐색기 창에서 해당 프로젝트 이름을 마우스 오른쪽 단추로 누르고 속성을 클릭합니다. 속성
페이지 창에서 디버깅을 클릭합니다. 솔루션을 시작할 때 다른 동작을 취할 수 있습니다. 시작 외부
프로그램(Start external program)을 클릭하고 텍스트 상자 오른쪽에 있는 단추를 클릭합니다. 표시되는 대화 상자에서,
솔루션이 시작될 때 시작하려는 프로그램으로 이동할 수 있습니다. Office 실행 파일이 들어 있는 디렉터리로 찾아가서 WINWORD.EXE를
클릭하고 열기를 클릭합니다. 속성의 모습은 그림 11과 같습니다.

그림 11. 프로젝트 코드를 디버그할 때 호스트 응용 프로그램이 로딩되도록 프로젝트 속성을 설정
확인을 눌러 속성 페이지 창을 닫습니다.
앞서와 같이, 솔루션 실행을 시도하기 전에 Word의 모든 인스턴스를 닫아야 합니다. 또한 코드 어딘가에 중단점을 배치하여 디버그 모드에서
솔루션과 함께 이것이 동작하는지 볼 수 있도록 해야 합니다. Visual Studio .NET의 디버그 메뉴에서 시작을 클릭하거나
F5를 눌러 솔루션의 디버그 버전을 시작합니다. 프로젝트를 실행하면 Word의 인스턴스도 시작됩니다. 솔루션 사용을 위한 나머지 절차는 릴리스
버전을 사용할 때와 동일합니다. Word를 닫으면 솔루션은 디자인 모드로 돌아갑니다.
결론
관리되는 코드로 스마트 문서 솔루션을 만들면 .NET Framework와 Visual Studio .NET이 제공하는 많은 장점을 활용할
수 있습니다. 강력한 보안 기능을 갖춘 관리되는 런타임을 활용할 수 있습니다. .NET 런타임은 또한 성능상의 장점도 제공하며 런타임의 형식
안전 특성은 코드를 충돌에 대해 더욱 안전하게 지켜 줄 수 있습니다. .NET을 이용하면 더욱 지능적인 예외 처리 루틴을 만들 수 있으며
Framework에서 제공하는 강력한 언어 기능을 이용하여 솔루션을 더 쉽게 코딩할 수 있습니다.
Visual Studio .NET 2003은 구현된 인터페이스로부터 모든 구성원들을 자동으로 추가하여 솔루션을 더 빨리 구성하고 실행할 수
있도록 해줍니다. Visual Studio .NET 2003에는 이외에도 생산성을 높여 주는 기능들이 많이 있습니다. 스마트 문서 솔루션은 이
도구를 사용하여 만들 수 있는 솔루션 가운데 하나입니다. 스마트 문서는 Office 응용 프로그램을 사용자의 작업에 더 잘 응답하도록 하고,
사용자가 문서의 데이터를 더 쉽게 다룰 수 있도록 하고, 그리고 이를 외부 데이터 원본에 연결하는 데에 있어 커다란 진전을 이루었습니다. 이
"Hello World" 스타일 예제에서는 사용자 고유의 Microsoft Office 솔루션에 이러한 장점을 제공하는 스마트 문서 개발 작업의
기본적인 절차를 상세히 구현했습니다.
John R. Durant는 MSDN Office 개발자 센터 (US)를
관리하고 있으며 개발자들이 Office에서 가장 뛰어난 최신 기술들을 사용하도록 지원하고 기존 버전에 대한 설명을 제공하는 임무를 맡고
있습니다. 할 수만 있다면, 그는 이 약력을 소개하는 공간까지도 빌려 줄 것입니다.
|