다음을 통해 공유


관리되는 라이브러리 사용

공용 언어 런타임은 Microsoft .NET Framework의 기초입니다. 공용 언어 런타임은 실행 시 코드를 관리하는 에이전트로 간주하여 메모리 관리, 스레드 관리 및 원격과 같은 핵심 서비스를 제공하는 동시에 엄격한 코드 보안을 적용할 수 있습니다. 실제로 코드 관리 개념은 공용 언어 런타임의 기본 원칙입니다. 공용 언어 런타임을 대상으로 하는 코드를 관리 코드라고 합니다. 공용 언어 런타임을 대상으로 하지 않는 코드를 네이티브 코드라고 합니다.

프레임워크 클래스 라이브러리는 기존 명령줄 또는 GUI(그래픽 사용자 인터페이스) 애플리케이션부터 ASP.NET 및 Web Services에서 제공하는 최신 혁신을 기반으로 하는 애플리케이션에 이르기까지 다양한 애플리케이션을 개발하는 데 사용할 수 있는 재사용 가능한 클래스의 포괄적인 개체 지향 컬렉션입니다.

태블릿 PC 관리형 라이브러리에는 태블릿 PC에서 필기 입력 및 출력을 지원하고 다른 컴퓨터와의 데이터 교환을 지원하기 위해 프레임워크를 확장하는 관리되는 개체 집합이 포함되어 있습니다.

예외

Tablet PC API의 관리되는 라이브러리 개체는 COM 라이브러리 구현을 래핑합니다. 기본 COM 라이브러리 개체 또는 컨트롤이 오류를 반환하는 경우 관리되는 API는 내부 COM 예외에 대한 세부 정보를 제공하는 Marshal.ThrowExceptionForHR 예외를 throw합니다. 반환될 수 있는 가능한 오류에 대한 자세한 내용은 COM 라이브러리 참조의 HRESULT 값을 참조할 수 있습니다.

개체 비교

Tablet PC 플랫폼 관리 라이브러리의 모든 개체에 대해 Equals 동일한 두 개체를 올바르게 비교하기 위해 재정의되지 않습니다. API(관리형 애플리케이션 프로그래밍 인터페이스)는 Equals 함수 또는 equals(==) 연산자를 통해 같음 개체의 비교를 지원하지 않습니다.

최신 Microsoft.Ink.dll 바인딩

최신 Microsoft.Ink.dll 어셈블리는 Microsoft.Ink.dll 버전 1.0 및 Microsoft.Ink.15.dll호환되는 대체입니다. 대부분의 경우 이전 어셈블리와 함께 배포된 애플리케이션을 변경할 필요가 없습니다. 그러나 경우에 따라 공용 언어 런타임 로더에 이전 DLL이 참조된 곳마다 최신 DLL(동적 연결 라이브러리)을 사용하도록 지시해야 합니다.

다음 기술을 사용하여 새 어셈블리에 명시적으로 바인딩해야 하는 유일한 경우는 애플리케이션이 1.7과 같은 최신 버전 어셈블리를 참조하는 구성 요소와 함께 버전 1.0 또는 1.5 어셈블리를 참조하는 구성 요소를 사용하고 해당 구성 요소가 데이터를 교환할 수 있는 경우입니다.

공용 언어 런타임 로더에 최신 DLL을 사용하도록 지시하는 가장 좋은 방법은 애플리케이션 수준에서 어셈블리 버전을 리디렉션하는 것입니다. 애플리케이션의 구성 파일에 어셈블리 바인딩 정보를 배치하여 애플리케이션에서 최신 버전의 어셈블리를 사용하도록 지정할 수 있습니다. 애플리케이션 수준에서 어셈블리 버전을 리디렉션하는 방법에 대한 자세한 내용은 어셈블리 버전 리디렉션, 특히 "구성 파일에서 어셈블리 바인딩 지정" 섹션을 참조하세요.

실행 파일과 동일한 디렉터리에 구성 파일을 만들어야 합니다. 구성 파일의 이름은 실행 파일과 같아야 하며 그 뒤에 .config 파일 확장명이 있어야 합니다. 예를 들어 애플리케이션의 경우 MyApp.exe구성 파일은 MyApp.exe.config 파일이어야 합니다. 구성 파일은 다음 예제와 같이 bindingRedirect 요소를 사용하여 모든 이전 버전을 최신 버전에 매핑하도록 합니다.

<bindingRedirect oldVersion="0.0.0.0-1.7.2600.xxxx" newVersion="1.7.2600.xxxx" />

구성 파일에 대한 XML(Extensible Markup Language)을 생성하는 방법의 예제를 포함하여 구성 파일에 대한 자세한 내용은 bindingRedirect리디렉션 어셈블리 버전참조하세요.

Microsoft Windows XP Tablet PC Edition Development Kit 1.7 이상 버전으로 만든 애플리케이션은 새 버전의 Microsoft.Ink 어셈블리에 자동으로 바인딩됩니다. 어셈블리 바인딩에 대한 자세한 내용은 런타임에서 어셈블리찾는 방법을 참조하세요.

메모

애플리케이션 정책을 사용하여 업데이트된 어셈블리에 바인딩하는 것은 Divider 클래스 또는 PenInputPanel 클래스를 사용하는 애플리케이션에서는 작동하지 않습니다. 이러한 클래스 중 하나를 사용하는 애플리케이션은 업데이트된 어셈블리를 참조한 후 Microsoft.Ink.15.dll 계속 사용하거나 다시 컴파일해야 합니다.

 

이벤트 다루기

관리되는 개체에 대한 이벤트 처리기 내의 코드가 예외를 throw하는 경우 예외는 사용자에게 전달되지 않습니다. 예외가 전달되도록 하려면 관리되는 이벤트에 대해 이벤트 처리기에서 try-catch 블록을 사용합니다.

양식 관리

Form 클래스 및 기본 클래스는 종료자를 정의하지 않습니다. 양식에서 리소스를 정리하려면 Dispose호출하는 종료자(예: ~를 사용하는 C# 소멸자)를 제공하는 하위 클래스를 작성합니다. 정리를 수행하려면 종료자가 Dispose를 재정의한 다음, 기본 클래스 Dispose를 호출합니다. 부울 매개 변수가 FALSE인 경우, Dispose 메서드에서 Finalize 메서드가 필요한 다른 개체를 참조하지 마세요. 이러한 개체가 이미 종료되었을 수 있습니다. 리소스 해제에 대한 자세한 내용은 Finalize 메서드 및 소멸자참조하세요.

Forms과 RecognizerContext

RecognizerContext 이벤트는 폼이 있는 스레드와 다른 스레드에서 실행됩니다. Windows Forms의 컨트롤은 특정 스레드에 바인딩되며 스레드로부터 안전하지 않습니다. 따라서 컨트롤의 호출 메서드 중 하나를 사용하여 호출을 적절한 스레드로 마샬링해야 합니다. 컨트롤의 네 가지 메서드는 스레드로부터 안전합니다. Invoke, BeginInvoke, EndInvokeCreateGraphics 메서드입니다. 다른 모든 메서드 호출의 경우 다른 스레드에서 호출할 때 이러한 호출 메서드 중 하나를 사용합니다. 자세한 내용은 스레드에서 컨트롤 조작 을 참조하세요.

이벤트 대기 중

태블릿 PC 환경은 다중 스레드입니다. 다른 대기 방법 대신 CoWaitForMultipleHandles 함수를 사용하여 애플리케이션이 이벤트를 기다리는 동안 재진입이 가능한 구성 요소 개체 모델(COM) 호출이 다중 스레드 아파트(MTA)에 들어올 수 있도록 합니다.

잉크 스트로크 컬렉션 사용

Ink 개체에서 가져온 Strokes 컬렉션의 인스턴스는 가비지 수집되지 않습니다. 메모리 누수 방지를 위해 이러한 컬렉션 중 하나로 작업할 때마다 아래와 같이 "using" 문을 사용합니다.

using (Strokes strokes = myInk.Strokes)
{
    int i = strokes.Count;
}

관리되는 개체 및 컨트롤 삭제

메모리 누수 방지를 위해 개체 또는 컨트롤이 범위를 벗어나기 전에 이벤트 처리기가 연결된 모든 Tablet PC 개체 또는 컨트롤에서 Dispose 메서드를 명시적으로 호출해야 합니다.

애플리케이션의 성능을 향상시키려면 더 이상 필요하지 않은 경우 다음 개체, 컨트롤 및 컬렉션을 수동으로 삭제합니다.

다음 C# 예제에서는 Dispose 메서드가 사용되는 몇 가지 시나리오를 보여 줍니다.

// A field for a Divider object
private Microsoft.Ink.Divider theDivider;

// A method that creates a Divider object
public void CreateDivider()
{
    // Make sure any previous Divider object was disposed of.
    if (null != theDivider)
    {
        theDivider.Dispose();
        theDivider = null;
    }
    // Create the Divider object.
    theDivider = new Microsoft.Ink.Divider();

    // The remainder of the method
}

// A method that disposes of the Divider object
public void DisposeDivider()
{
    // The remainder of the method

    // Dispose of the Divider object.
    if (null != theDivider)
    {
        theDivider.Dispose();
        theDivider = null;
    }
}

// A method that uses a local PenInputPanel object.
public void UsePenInputPanel()
{
    // Create the PenInputPanel object.
    Microsoft.Ink.PenInputPanel thePenInputPanel =
        new Microsoft.Ink.PenInputPanel();

    // The remainder of the method

    // Dispose of the PenInputPanel object before exiting.
    thePenInputPanel.Dispose();
    thePenInputPanel = null;
}