IE에서 닷넷 스마트 클라이언트 개발1-스마트 클라이언트 탐험하기3 :: 스마트클라이언트 정보[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

스마트클라이언트 정보
[1]
등록일:2008-03-28 09:12:09 (0%)
작성자:
제목:IE에서 닷넷 스마트 클라이언트 개발1-스마트 클라이언트 탐험하기3

IE에서 닷넷 스마트 클라이언트 개발1-스마트 클라이언트 탐험하기3

 

스마트 클라이언트 탐험하기-3
  저 자 : 정성태
  출판일 : 2004년 2월호

   이벤트 구현
어 떻게 닷넷 프레임워크의 클래스가 COM 개체로 맵핑되는지에 대한 내부 구현은 정확히 알 수 없다. 하지만 IUnknown 관련한 인터페이스에 vtable을 맞추어 주면 호출할 수는 있을 것이다. 마찬가지로 이벤트 역시 COM의 규약을 따르기만 해준다면 상호연동을 하게 될 것이다. 이것을 개발자가 해주어야 할까? 액티브X 시절에는 그렇게 하는 것이 당연했지만 닷넷 프레임워크의 스마트 클라이언트로 와서는 코드라기보다는 ‘특성’으로 바뀌었다. 닷넷의 ‘특성’을 이용하여 개발자가 ‘표시’만 해두면 모든 코드는 컴파일러가 알아서 삽입해 준다. 이벤트 소스를 알리는 특성과 이벤트를 발생하는 내부 코드만 준비하면 끝인 셈이다. 물론, 이벤트를 거는 것은 외부 코드에서 해야 할 일이다.
이제부터 앞에서 만든 TreeControl에서 노드가 선택되면 이벤트를 스크립트에서 받고 URL을 얻어내어 해당 주소로 네비게이션하는 것을 구현해 보겠다.

① 이벤트 소스 인터페이스 마련
문법은 VC++ ATL에서 IDL을 다룰 때와 상당히 유사하다. SmartClient 프로젝트에서 ‘TreeEvent.cs’ 파일을 새로 추가하고 다음과 같이 이벤트 인터페이스를 구현하자.
public interface ITreeControlCOMIncoming -----------------
{
void LoadXML( string text );
string SelectedNodeText { get; }
}
[Guid(“A59B958D-B363-454b-88AA-BE8626A131FA”)] ---------------
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] -------
public interface ITreeEvent
{
[DispId(0x60020000)] -------------------------------------
void NodeClicked();
}
ⓐ 기본적인 스마트 클라이언트의 메쏘드를 스크립트에서 호출하고 싶을 때는 public 제한자를 주는 것으로 끝났지만, 이벤트를 구현하면서는 외부에서의 호출을 위한 목록을 인터페이스에서 기술해 주고 그것을 상속받아야 한다. 뒤에 TreeControl 클래스에 주게 될 ClassInterfaceType.None으로 인해 외부로 기능을 노출시킬 메쏘드나 프로퍼티를 이와 같이 인터페이스를 정의하여 관리하게 된다.
ⓑ 해당 이벤트 소스 인터페이스에 대해서 임의적으로 유일한 GUID 값을 설정한다.
ⓒ 스크립트에서 이벤트를 걸 것이기 때문에 IDispatch가 적용돼야 한다.
ⓓ 각각의 이벤트에 대해 임의적으로 DispID 상수 값을 설정한다.

② 이벤트 소스 인터페이스와 TreeControl 클래스와 연결
VC++로 ATL을 해보지 않은 분들은 앞의 사항만 해도 낯설 것이다. 하지만 거의 정형화된 틀이니 사용되는 특성들이 다소 낯설지라도 지금 보여주는 ‘틀’대로만 해주면 문제가 발생하진 않을 것이다.

[ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces( typeof( ITreeEvent ) )] ---------------------------
public class TreeControl : System.Windows.Forms.UserControl,
ITreeControlCOMIncoming ----------------------------------------
{
private System.Windows.Forms.TreeView _treeView;
     public delegate void NodeClickedHandler(); -------------------
public event NodeClickedHandler NodeClicked;
protected void OnNodeClicked()
{
if ( NodeClicked != null )
{
Invoke( NodeClicked, null );
}
}
public string SelectedNodeText
{
get
{
if ( _treeView.SelectedNode == null )
{
return string.Empty;
}
XmlNode aNode = _treeView.SelectedNode.Tag as XmlNode;
return aNode.OuterXml;
}
}
}

ClassInterfaceType.None 으로 인해 상속받은 인터페이스에 명시된 프로퍼티와 메쏘드만을 외부에 노출시키겠다는 것을 알리고 ComSourceInterface 특성으로 TreeControl의 이벤트 소스 인터페이스가 ITreeEvent라고 알리게 된다. 이 특성을 컴파일러가 인지할 것이고 그에 따른 코드를 자동으로 생산해 낼 것이다.
ClassInterfaceType.None 특성 지정으로 인해 ITreeControlCOMIncoming 인터페이스에 명시적으로 지정된 메쏘드와 프로퍼티만을 외부에 공개한다.
이벤트 구현은 C# 이벤트 구현을 따른다. ComSourceInterface에서 선언된 메쏘드 하나당 delegate 하나씩 선언하고 대응되는 이벤트를 정의하면 된다.

③ 이벤트 발생
TreeControl의 경우 노드가 선택될 때마다 외부에 이벤트를 발생시킬 것이므로 TreeView 컨트롤의 AfterSelect 이벤트가 발생할 때마다 다음과 같이 호출해 주면 된다.

private void _treeView_AfterSelect(object sender,
System.Windows.Forms.TreeViewEventArgs e)
{
OnNodeClicked();
}
}

④ 스크립트에서 이벤트 받기
역시 기존 액티브X 이벤트 처리하는 것과 다를 것이 없다. 다음은 선택된 트리 노드로부터 XML 텍스트를 받아오고 그 데이터 중에서 URL 노드의 값을 읽어들여 해당 사이트로 이동을 한다.



모 두 구현을 했으면 컴파일하고 http://127.0.0.1/WebApp/Web Form1.aspx로 테스트 해보자. 이제까지의 코딩을 따라한 독자들께는 죄송하지만 앞의 구현은 ‘예외’ 발생으로 끝나고 만다. 왜 예외 상황이 되어버린 것일까? 이런 현상은 스마트 클라이언트에서 이벤트를 실행하는 것이 닷넷의 ‘보안’에 위배되기 때문이다. 즉 인터넷으로부터 다운받은 모듈 코드가 ‘Unmanaged 코드’를 호출할 수 없도록 해놓은 것이다. 이벤트는 명백히 COM 개체로 구현되고 COM은 Unmanaged 코드라서 닷넷은 그것을 허용치 않는 것이다.
여기서 한 가지 의문이 생기는 독자들이 있을지도 모르겠다. 스마트 클라이언트를 스크립트에서 접근할 때는 마찬가지로 COM 호출을 하는 것인데, 그것은 왜 예외가 아닌가? 그 이유는 다음과 같다. 자바 스크립트에서 스마트 클라이언트를 호출하는 것은 외부에서 닷넷 코드를 호출하는 것뿐이다. 즉 우리가 만든 컨트롤 내부의 닷넷 코드가 Unmanaged 코드를 실행하는 것이 아니고, 외부에서 Unmanaged 코드를 통해 닷넷 코드를 실행시키는 것이다. 하지만 이벤트 처리는 다르다.
COM에서의 이벤트 처리는 ‘쌍방향 통신’이다. 이벤트를 걸게(sinking) 되는 것은 예외 조건에 걸리지 않는다. 스크립트 엔진이
[본문링크] IE에서 닷넷 스마트 클라이언트 개발1-스마트 클라이언트 탐험하기3
[1]
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=3179
작성자
비밀번호

 

SSISOCommunity

[이전]

Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.