SimpleIsBest.NET

유경상의 닷넷 블로그
이 글은 오래된 전에 작성된 글입니다. 따라서 최신 버전의 기술에 알맞지 않거나 오류를 유발할 수 있습니다. 저자는 이 글에 대한 질문을 받지 않을 것입니다. 하지만 이 글이 리뉴얼 되면 이 글에 대한 질문을 하거나 토론을 할 수도 있습니다.
스마트 클라이언트 시리즈 두 번째 글입니다. 필자가 처음 스마트 클라이언트를 접한 것은 MSDN Magazine의 2002년 6월호에 실린 기사(Return of the Rich Client: Code Access Security and Distribution Features in .NET Enhance Client-Side Apps)를 읽었을 때 였습니다. 기사를 읽고 예제 코드를 작성해 보니, 웹 UI의 한계를 극복할 수 있는 좋은 방법으로 생각하여, Web Integrated Terminal 이란 이름으로 개발 프레임워크를 작성하는 회사(그 때 당시 재직 중이던 D 모 SI 회사) 내부 과제를 진행했었죠. 그러던 중 회사를 퇴사하게 되어 유야 무야 다른 일에 얽매어 살다가, 2004년 부터 실질적인 프로젝트로서 다양한 POS(Proof of Concept) 프로젝트나 실제 프로젝트를 하게 되었습니다. 저도 처음에는 스마트 클라이언트에 대해 자세히 모른 채로 달려들었다가 다양한 기술적인 이슈에 부딪히곤 했습니다. 그러나 대부분의 경우는 스마트 클라이언트이기 때문에 발생하는 이슈가 아닌 닷넷 프레임워크의 기본 행동을 제가 몰랐기 때문이었으며, 스마트 클라이언트 자체의 이슈는 많지 않았습니다. 앞으로 이 시리즈를 통해 차근차근 알아보도록 하겠습니다.
시리즈 목차

Smart Client (II) : Trivial Sample

지난 포스트에서는 스마트 클라이언트의 용어적인 정의를 해 보았다. 이제부터 스마트 클라이언트라 함은 닷넷 스마트 클라이언트를 말하는 것이며, "웹으로부터 어셈블리(DLL, EXE)를 다운로드 하여 수행하는 클라이언트"를 말하는 것으로 하겠다. 용어를 혼동하지 않도록 하자.

이번 포스트는 아주 기본적인 스마트 클라이언트를 작성해 보겠다. 스마트 클라이언트에 대해 전혀 백그라운드가 없는 독자도 있을 것이니, 간단한(?) 예제를 작성함으로써, 스마트 클라이언트가 무엇인지 감을 잡도록 하는 것이 이번 포스트의 목적이라 하겠다. 이 포스트는 Step-by-Step 스타일의 글로써(개인적으로는 그다지 좋아하지 않는 스타일이다) 내용이 상당히 길다(졸라 빡셌다... -_-). 내용은 길지만 깊은 부분을 다루지 않기 때문에 어렵지는 않을 것이다. 스마트 클라이언트의 상세한 기술적인 측면, 팁, 주의 사항 등의 상세한 내용은 이어지는 시리즈의 글에서 다루게 될 것이다.

Creating Client Module for Smart Client

스마트 클라이언트는 클라이언트 측에서 수행될 모듈(닷넷 용어로는 어셈블리)을 HTTP를 통해 웹으로부터 다운로드 받는다고 하였다. 그렇다면 클라이언트로 다운로드 될 닷넷 어셈블리를 작성하는 것이 시작점으로 볼 수 있다. 이제 클라이언트 모듈을 작성해 보자. 설명은 Visual Studio .NET 2003 영문판을 기준으로 설명할 것이다. 아니꼬운 사람은 영문판을 깔던가, 잘 해석해서 한글판에 대응되는 부분을 찾던가 알아서 하길... 또한, Visual Studio 2005를 사용하는 독자라면 알아서 2005로 작성하기 바란다. 물론 여기서 작성한 코드는 모두 2005에서도 작동한다.

  • 비주얼 스튜디오를 수행시키고 빈 솔루션(File > New > Blank Solution 메뉴) 을 만든다. 나중에 테스트 및 Stand-alone 스마트 클라이언트 EXE 프로젝트를 추가할 것이기 때문에 이렇게 하는 것이며, 여러 프로젝트를 포함하는 솔루션을 작성할 때 파일 시스템 디렉터리 구조를 보기 좋게 구성할 수도 있다(필자는 이러한 구조를 즐겨 사용한다). 솔루션 이름은 꼴리는 대로 주면 된다. 필자는 SmartClient Basic 이란 이름을 사용했다.
     
  • 클라이언트 모듈을 위한 Class Library 프로젝트를 추가한다(화면1). Windows Control Library 프로젝트를 추가해도 되지만, 필자는 Class Library 프로젝트를 더 즐겨 사용한다(이런 개인적인 취향 가지고 태클 걸지 말자. 피곤하다... 사실 두 프로젝트의 차이는 기본으로 프로젝트에 추가되는 참조 어셈블리와 .cs 파일만이 다를 뿐이다). 프로젝트의 이름은 ClientModule로 한다. 이름은 가급적 필자가 지정한 대로 따라 하는 것이 나머지 문서를 읽는데도 도움이 될 것이며, "왜 나만 안되지?" 같은 상황을 피하도록 도와주곤 한다. Class Library 프로젝트를 사용한 독자라면 참조에 System.Windows.Form 과 System.Drawing 어셈블리를 추가하도록 하자. Windows Control Library 프로젝트를 사용한 독자는 이미 참조가 추가되어 있을 것이다.


화면1. ClientModule 프로젝트 추가

  • 프로젝트를 만들었으면, 기본으로 추가되어 있는 Class1.cs 파일을 지워버린다. 우리의 이번 예제에는 전혀 쓸모가 없다. 이제 클라이언트에 UI를 표시할 User Control을 프로젝트에 추가한다. Project 메뉴를 사용하거나 프로젝트를 오른쪽 클릭하면 나타나는 컨텍스트 메뉴에서 Add User Control을 선택하고 이름을 UIControl로 지정한다.
     
  • UIControl에 2개의 Label 컨트롤과 3개의 Button 컨트롤을 올려놓고 적당히 디자인을 한다. 필자는 두 개의 Label 컨트롤에 lblTitle, lblAssemblyVersion 이란 이름을 주었고, 버튼에는 각각 btnTest1, btnTest2, btnTest3라고 이름 지었다. 적당히 폰트와 배경색을 지정하면 화면2와 같이 이뿌장한 컨트롤을 만들 수 있다.


화면2. UIControl 추가와 디자인

  • 컨트롤의 Load 이벤트를 추가하여 현재 버전을 화면에 표시하도록 코딩을 한다. 현재 ClientModule의 버전을 알아내는 것은 어렵지 않다. Assembly 클래스의 스태틱 메쏘드인 GetExecutingAssembly 메쏘드를 호출하면 ClientModule 어셈블리를 반환하게 되고, 이 Assembly 인스턴스에 대해 GetName() 메쏘드를 통해 AssemblyName 객체를 알아낸 후, 다시 AssemblyName.Version 속성을 액세스 하면 된다(리스트1). 그리고 테스트 버튼 1에 대해 이벤트 핸들러를 간단히 작성하자.

// 로드 이벤트 핸들러

private void UIControl_Load(object sender, System.EventArgs e)

{

    // 현재 어셈블리 버전을 표시한다.

    System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();

    lblAssemblyVersion.Text = "Assembly Version : " + assembly.GetName().Version.ToString();

}

 

// 테스트1 버튼 클릭 이벤트 핸들러

private void btnTest1_Click(object sender, System.EventArgs e)

{

    MessageBox.Show("스마트 클라이언트 작동 테스트",

        "테스트", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

리스트1. 로드 이벤트와 테스트 버튼 #1에 대한 이벤트 핸들러 작성

  • 마지막으로 AssemblyInfo.cs를 열어 어셈블리의 버전 값을 고정 시키도록 한다. 나중에 버전을 바꾸어가며 테스트해야 할 것이므로 변하는 값을 사용하여 혼동을 일으키지 않도록 하자. 그리고, AssemblyInfo.cs 에서 다른 것은 수정하지 않는다. 특히, 서명을 하지 않았음에 유의하도록 한다.

// 어셈블리 버전

[assembly: AssemblyVersion("1.0.0.0")]

  • 이제 솔루션을 빌드하여 컴파일이 제대로 되는지 확인한다. 졸라 잘 따라 했다면 컴파일 오류는 없어야 한다.
     
  • 필자가 작성한 코드 이외의 기능은 가급적 포함시키지 않는 것이 좋다. 많은 기능들이 닷넷 보안 설정(CAS; Code Access Security)을 위배하여 SecurityException이 발생할 수 있기 때문이다. 닷넷 보안 설정에 대한 상세한 내용은 추후 포스트에서 상세히 다루게 될 것이다.

Creating Smart Client Launcher Application

앞서 작성한 스마트 클라이언트 모듈이 제대로 동작하는 가를 테스트하고, 나중에 Stand-alone 으로 작동하는 스마트 클라이언트 시나리오를 테스트하기 위한 목적으로 윈폼 어플리케이션을 작성하도록 한다. 일단 이 테스트 어플리케이션으로 클라이언트 모듈을 다양한 스마트 클라이언트 시나리오에 의해 테스트 할 것이다. 나중에도 다시 언급하겠지만 스마트 클라이언트를 디버깅하는 것은 상당히 불편하다. 따라서 작성해 놓은 클라이언트 모듈을 테스트할 용도로 간단한 EXE를 작성하여 테스트를 수행하는 것이 좋다. 이렇게 로컬 컴퓨터에서 스마트 클라이언트 시나리오가 아닌 상황에서 테스트를 충분히 수행하고, 일반적으로 모듈이 잘 작동하는 경우에만 클라이언트 모듈을 웹 서버에 올려놓고 스마트 클라이언트 시나리오에 의해 최종 테스트를 수행하는 것이 생산성을 올리는 좋은 방법이므로 기억해 두기 바란다.

편의상 스마트 클라이언트 모듈을 로드 하는 어플리케이션을 런처(launcher)라고 명명할 것이다. 이 런처 프로그램을 솔루션에 추가해 보자.

  • 솔루션에 Add > New Project...를 선택하고 Windows Application 프로젝트를 추가한다(프로젝트 이름은 Launcher로 하자). 이제 프로젝트에 추가된 기본 Form1.cs의 이름을 LauncherForm.cs 으로 수정하고, 클래스 이름 역시 LauncherForm 으로 바꾼다. 물론 이렇게 하지 않고 Form1 이란 이름을 써도 전혀 상관 없지만, 필자는 이런 꼴을 못 보는 이상한 결벽증 비스무레한 것이 있어서 그렇다. 이런 결벽증에는 이유가 있다. 몇 달 후에 작성한 예제를 다시 열어 볼 때, 파일 이름과 클래스 이름이 전혀 의미 없는 Form1 따위로 되어 있으면 소스를 까보지 않고는 당췌 이 녀석이 뭐하는 녀석인지 알 수 없는 경우가 종종 있기 때문이다. 그래서 이런 중병에 걸렸다는... 개인적으로 나쁜 병이라고 생각하지 않는데, 독자들은 어떤지 모르겠다...
     
  • 폼에 앞서 작성한 클라이언트 모듈의 UIControl을 추가한다. 먼저 필요한 것은 작성해 놓은 클라이언트 모듈(어셈블리)을 '참조' 해야 한다. Launcher 프로젝트의 참조 추가에서 ClientModule 프로젝트를 '참조'하도록 한다. 참조 후 툴박스(Toolbox)의 My User Controls 탭을 살펴보면 방금 작성해 놓은 UIControl 이 추가되어 있는 것을 알 수 있을 것이다. 이것을 이용해 폼위에 UIControl 을 올려 놓는다(화면3 참조).


화면3. 폼에 UIControl 추가

  • 추가한 컨트롤의 이름을 적절히 주고(필자는 ucClient라는 이름을 사용했다), Dock 속성을 Fill로 설정하여 폼에 가득 차도록 설정한 후, 기타 다른 속성(폼 타이틀, 크기 등등)을 설정한다. 그리고 AssemblyInfo.cs를 열어 어셈블리 버전을 역시 1.0.0.0 으로 고정하는 작업도 수행한다. 버전을 이렇게 고정하는 이유는 이미 언급한 바 있다.
     
  • 이제 컴파일을 수행하고, 컴파일 오류가 없다면 수행하여 작동을 테스트 해 보자. 별로 한 것이 없으므로 수행은 제대로 되어야만 한다.

IE Embedded Smart Client Setup & Test

Laucher가 잘 작동하면 스마트 클라이언트를 위한 코드 작성은 일단락 되었다. 이제 브라우저에 임베딩 되는 스마트 클라이언트 시나리오를 테스트 해보도록 하겠다. 브라우저가 클라이언트 모듈을 다운로드 받을 수 있도록 ClientModule.dll 을 웹 서버에 설정한다. 여기서 설명하는 기준은 단일 컴퓨터에서의 테스트이다. 만약 웹 서버가 별도에 존재한다면 해당 서버에 알맞은 설정을 해주면 된다. 스마트 클라이언트는 순수한 클라이언트 기술이므로 웹 서버는 IIS 가 아니어도 무방하다.

  • SmartClientBasic 이란 폴더를 적당한 위치에 생성하고(필자는 솔루션 폴더 바로 하위에 만들었다), 웹 공유를 설정한다. 물론, 이렇게 하지 않더라도 C:\inetpub\wwwroot 디렉터리의 하위에 디렉터리를 작성하거나 직접 IIS 관리자를 통해 가상 디렉터리를 잡아주어도 무방하다.
     
  • SmartClientBasic 폴더에 ClientModule.dll 를 복사한다.
     
  • 이제 적당한 텍스트 에디터를 사용하여 스마트 클라이언트를 위한 웹 페이지(SmartClient.htm)를 작성한다. 이 웹 페이지는 IE에 임베딩 되는 스마트 클라이언트 시나리오를 위해 필요한 것이다. Stand-alone 스마트 클라이언트의 경우, 이런 웹 페이지는 불필요 하다.
     
  • SmartClient.htm을 리스트2와 같이 작성한다. 중요한 것은 <OBJECT> 태그의 classid 속성에 클라이언트 모듈의 이름(ClientModule.DLL)을 주는 것이다. 그리고 이 이름 뒤에 # 문자로 구분하여 표시할 User Control 클래스의 전체 이름(네임스페이스를 포함하는 이름)을 명시한다.
<html>
<head>
<title>스마트 클라이언트 따라 하기 예제</title>
</head>
<body>
    
<h1>Browser Embedded Smart Client Example</h1>
    
<p>다음은 브라우저에 &lt;OBJECT&gt; 태그를 사용하여 닷넷 윈폼 컨트롤을 호스팅 하는 스마트 클라이언트 예제 입니다.</p>
    
<object classid="ClientModule.DLL#ClientModule.UIControl" width=100% height=240>
    
</object>
</body>

</html>

리스트2. 스마트 클라이언트를 호스팅하는 웹 페이지, SmartClient.htm

  • 마지막으로, C:\Windows\System32\Drivers\Etc 디렉터리의 hosts 파일에 다음 항목을 추가한다. 이렇게 하는 이유는, 스마트 클라이언트에 대한 CAS(Code Access Security) 설정을 테스트하기 위함이다. 그냥 localhost를 사용해도 되지만, 이미 스마트 클라이언트 접해본 독자는 localhost 에 대해 CAS 설정을 했을 가능성이 있기 때문이다. CAS에 대해서는 조금 후에 이야기를 하겠다.
# Copyright (c) 1993-1999 Microsoft Corp.
#

...... 중략 ......

127.0.0.1 localhost
127.0.0.1 localhost.com   # 스마트 클라이언트 테스트용 호스트 이름

...... 생략 ......
 
  • 이제 브라우저를 수행시키고 http://localhost.com/SmartClientBasic/SmartClient.htm 페이지를 브라우징 해본다. 약간의 지연 후에 화면 4와 같은 결과가 나타날 것이다!


화면4. 브라우저에 임베드 된 스마트 클라이언트

브라우저 임베딩 스마트 클라이언트가 작동하는 라이브 예제를 보고 싶다면, 다음 링크를 사용한다.
라이브 예제 수행

Stand-alone Smart Client Setup & Test

브라우저에 임베딩 되는 시나리오를 해 보았으니 이제 독립적으로 작동하는 스마트 클라이언트를 설정하고 테스트 해보자. Stand-alone 스마트 클라이언트라 함은 독립적인 수행 파일(exe)이 브라우저와 독립적인 프로세스로 작동하는 것을 말한다. 대개의 경우 독립 스마트 클라이언트는 고유의 폼 윈도우를 갖으며, 브라우저 내부에 컨트롤을 표시하는 것은 불가능하다 (아주, 매우, 많이, 엄청나게 고생을 해서 Active Document 서버 형태로 구현하면 가능은 할 것 같다. 해보지는 않아서 잘 모르겠다... -_-).

독립 스마트 클라이언트는 수행할 exe를 필요로 한다. 우리는 이미 테스트를 위해 Launcher.exe를 작성했으므로 이것을 독립 스마트 클라이언트로서 사용해 보자.

  • 앞서 작성했던 SmartClientBasic 가상 디렉터리에 Launcher.exe 파일을 복사한다.
     
  • Launcher.exe 에 대한 링크를 포함하는 웹 페이지(SmartClient2.htm)를 SmartClientBasic 가상 디렉터리에 작성한다. 필요한 것은 URL 링크를 작성하기 위해 <A> 태그를 사용하고 href 속성에 Launcher.exe를 명시하는 것 뿐이다(리스트4 참조)
<html>
<head>
<title>스마트 클라이언트 따라 하기 예제</title>
</head>
<body>
    
<h1>Stand-alone Smart Client Example</h1>
    
<p>다음은 URL 링크를 사용하여 닷넷 윈폼 어플리케이션을 수행하는 스마트 클라이언트 예제 입니다.</p>
    
<a href="Launcher.exe">독립 스마트 클라이언트 수행 !</a>
    
</object>
</body>
</html>

리스트4. 독립 스마트 클라이언트를 구동하기 위한 웹 페이지, SmartClient2.htm

  • 약간 허무하지만, 이게 설정의 전부이다. 브라우저를 새롭게 수행시키고  http://localhost.com/SmartClientBasic/SmartClient2.htm 페이지를 브라우징 한다. 그리고 표시된 독립 스마트 클라이언트 링크를 클릭해 보자. 독립 스마트 클라이언트가 멋지게 나타날 것이다! (화면5)


화면5. 독립 스마트 클라이언트 수행 예제

  • 인터넷 바로가기를 통해서도 독립 스마트 클라이언트를 구동할 수 있다. 바탕화면(혹은 다른 임의의 디렉터리)에 바로가기(short cut)를 만들고 "바로가기 항목"에 Launcher.exe의 URL 경로를 준다. 그리고 이 바로가기를 더블 클릭해 보자. 결과는 브라우저 링크를 클릭하는 것과 동일하게 스마트 클라이언트가 나타나는 것을 알 수 있을 것이다. 스마트 클라이언트가 나타나기 전에 잠시 브라우저가 나타났다가 사라질 수 있다. 이는 정상적인 행동이며 막을 수 없다. 공연히 버그 운운하거나 브라우저가 깜박이지 않도록 하기 위해 삽질을 하지 않길 바란다. 브라우저가 나타나지 않는 경우도 있는데, 이는 브라우저가 화면에 나타나기도 전에 스마트 클라이언트가 구동된 상황이다. 시스템에 메모리가 적을 수록, CPU가 느릴 수록, 지저분하게 설치된 프로그램이 많을 수록 브라우저가 나타날 가능성이 높다.

화면5를 잘 노려보면 처음 보는 풍선 팁이 나타나고, 심지어는 폼의 아이콘과 타이틀도 변경되었음을 알 수 있다. 이는 닷넷 CAS 에 의해 코드의 일부만이 신뢰되었음(partially trusted)을 알리는 도움말이며, 타이틀의 앞에는 EXE를 다운로드 한  인터넷 영역(zone)이 표시되고, 타이틀의 뒤에는 다운로드 한 사이트가 나타난다. 물론 완전히 신뢰된(full trusted) 어플리케이션에는 이러한 표시가 없다.

또 한가지 생각할 것은, URL 링크에는 Launcher.exe 만이 명기 되었지만, Launcher.exe가 참조하는 ClientModule.dll 역시 다운로드 되었음을 알 수 있다. 클라이언트 모듈이 없다면 UI를 표시하는 컨트롤이 나타날 리 없지 않은가? 스마트 클라이언트는 참조된 어셈블리를 자동으로 다운로드 하는 능력을 갖고 있다. 사실 이러한 능력은 스마트 클라이언트 만의 능력이 아니라 닷넷 프레임워크의 기본 행동이며 스마트 클라이언트도 이 능력이 적용될 뿐이다. 상세한 내용은 스마트 클라이언트와 어플리케이션 도메인의 관계를 설명하는 포스트에서 다시 하기로 하겠다.

마지막으로 독립 스마트 클라이언트에서 주목할 점은 이 폼을 수행하는 프로세스가 무엇인가 하는 것이다. 작업 관리자(task manager)로 수행 중인 프로세스를 살펴보면, 아무리 찾아 봐도 Launcher.exe 프로세스는 보이지 않는다. 대신 IEExec.exe 프로세스를 볼 수 있을 것이다(화면6). 이 프로세스가 독립 스마트 클라이언트를 호스팅 하는 프로세스이며, 이 프로세스에 의해 Laucher.exe가 로드 되고 수행된다. 이 점에 대해서는 스마트 클라이언트의 원리를 설명하는 포스트에서 다시 상세하게 이야기 하도록 하겠다.


화면6. 독립 스마트 클라이언트와 IEExec.exe 프로세스

독립 스마트 클라이언트가 작동하는 라이브 예제를 보고 싶다면, 다음 링크를 사용한다.
라이브 예제 수행

Basic Trouble Shooting

닷넷 프레임워크 2.0이 설치된 시스템의 경우, 독립 스마트 클라이언트가 나타나지 않고, EXE를 다운로드 하려는 대화상자가 나타날 수 있다. 닷넷 프레임워크 2.0에서 보안이 강화 되서 인지, 필자도 아직 정확하지 않다. 이러한 경우, "인터넷 등록 정보"의 보안 탭에 "신뢰할 수 있는 사이트" 혹은 "로컬 인트라넷"의 사이트에 스마트 클라이언트 사이트(이 예제의 경우, localhost.com)를 추가하면 된다.

닷넷 프레임워크 버전에 관계 없이 독립 스마트 클라이언트나 브라우저 임베드 스마트 클라이언트를 기동하고자 할 때, DLL 혹은 EXE를 수행하겠냐고 물어보는 다이얼로그가 나타나는 경우가 있다. 이는 Windows 2003의 보안 강화 설정이 적용되어 있거나 아니면 인터넷 보안 설정에서 "안전한 것으로 표시된 ActiveX 컨트롤 스크립트" 와 "ActiveX 컨트롤 및 플러그 인 실행" 이 모두 "사용"으로 설정되어 있지 않기 때문이다.

이외에도 클라이언트 측의 설정에 따라서 다양한 문제가 나타날 수 있다. 필자가 슈퍼, 울트라, 초특급 트러블 슈터가 아닌지라 이들 문제를 모두 알 수는 없다. 다만 필요할 때마다 이러한 클라이언트 측 설정 문제를 언급하기로 하겠다.

Code Access Security Limitation

CAS(Code Access Security)는 코드가 어디서부터 로드 되었는가(로컬 시스템, 인트라넷, 인터넷 등등), 누가 작성했는가(어셈블리 서명) 등등에 의해 권한을 다르게 설정하여 시스템 자원을 보호하는 것을 말한다. 모든 닷넷 프로그램은 CAS의 지배를 받는다. 다만 우리가 잘 인지하지 못하는 것은, 로컬 컴퓨터에서 로드 되는 어셈블리는 모든 권한을 갖고 있기 때문에 아무런 제약이 없어서 이다. 반면 스마트 클라이언트는 어셈블리를 웹에서 다운로드 받기 때문에, CAS에 의해 권한의 제약을 받게 되는 것이다. 스마트 클라이언트와 CAS에 대한 내용을 모두 설명하기에는 그 내용이 방대하므로 다음 포스트에 미루기로 하고, 여기서는 간단한 테스트 몇 개만 해보기로 한다.

먼저 ClientModule 프로젝트의 UIControl 에 만들어 두었던 btnTest2 버튼에 대한 핸들러를 작성한다(리스트4). 코드는 로컬 컴퓨터의 C:\Windows 디렉터리에 존재하는 ODBC.INI 파일의 내용을 표시하는 간단한 코드이다.

// 테스트2 버튼 클릭 이벤트 핸들러

private void btnTest2_Click(object sender, System.EventArgs e)

{

    System.IO.StreamReader reader = System.IO.File.OpenText("c:\\windows\\odbc.ini");

    string result = reader.ReadToEnd();

    reader.Close();

    MessageBox.Show(result, "ODBC.INI 파일 내용",

        MessageBoxButtons.OK, MessageBoxIcon.Information);

}

리스트4. 파일 액세스를 수행하는 테스트 코드

로컬에서 Launcher.exe를 이용하여 테스트 해 본다. 아마 잘 작동할 것이다. 이제 수정된 ClientModule.dll을 SmartClientBasic 가상 디렉토리에 복사한다. 새로운 버전이 다운로드 되는가를 확인하기 위해 AssemblyInfo.cs 에서 버전 값을 수정하는 것도 좋다. 하지만 의미는 없다. 이에 대해서는 다른 포스트에서 상세히 설명하겠다(이에 대해서 닷넷의 버그이니 뭐니 하는 사람들도 있는데, 이런 사람을 보면 가까운 군부대나 경찰서 혹은 112에 신고하기 바란다).

새로운 ClientModule.dll 을 테스트 할 때 주의할 점이 있다. 브라우저 임베드된 스마트 클라이언트의 경우, 변경된 ClientModule.dll 이 다운로드 되고 브라우저 상에 나타나게 하기 위해서는 반드시 브라우저 프로세스(iexplorer.exe 프로세스)를 반드시 종료해야만 한다. 브라우저 임베딩 스마트 클라이언트는 다운로드 된 어셈블리가 브라우저 프로세스 내에 생성된 어플리케이션 도메인(AppDomain)에 로드 됨을 명심하자. 일단 어플리케이션 도메인에 로드 된 어셈블리는 어플리케이션 도메인이 Unload 되지 않는 한 메모리에서 제거되지 않는다. 따라서 웹 서버에서 아무리 ClientModule.dll을 갱신하더라도 단순히 웹 페이지를 "새로 고침" (F5 키) 하더라도 새로운 버전이 브라우저에 로드 되지 않는다(다운로드는 되지만 새 버전이 브라우저 프로세스에 갱신되지 않는다!). 따라서 브라우저 프로세스를 종료하여 다운로드 한 ClientModule.dll 이 프로세스에서 제거하고, 새로운 프로세스에서 테스트를 수행 해야 한다. 독립 스마트 클라이언트의 경우, 브라우저와 다른 프로세스를 사용하므로 해당 사항이 없다.

독립 스마트 클라이언트 이건 브라우저에 임베딩 된 스마트 클라이언트 이건 테스트 #2 버튼을 누르면 얄짤없이 화면7과 같은 예외가 발생한다. 이 예외 메시지를 잘 뜯어 보면 FileIOPermission 이 없어서 발생한 것으로 보이며, 예외가 발생한 위치는 FileStream 클래스의 생성자(constructor)이다. 뭔 말인고 하면, 닷넷 프레임워크의 클래스들(BCL; Base Class Library)는 CAS에서 정의하는 다양한 권한 검사를 코드 곳곳에서 수행하고 있다는 것이다.


화면7. CAS에 의한 SecurityException

한가지 다행스러운 것은 CAS가 완전히 모든 것을 막아버리는 것이 아니라는 점이다. 보안 상 인터넷에서 다운로드 받은 닷넷 어셈블리(DLL 혹은 EXE)가 로컬 파일 시스템에 접근하려 한다 든가, 레지스트리에 접근하거나, Unmanaged 코드를 액세스하는 등의 것을 막고, 다른 웹 사이트로 정보를 전송하는 것을 막을 뿐이다. 기본적으로 CAS 설정은 안전한 UI 표시, 네트워크 액세스, 파일 시스템에 대한 액세스를 허용하고 있다. 한가지 재미있는 권한은 원래 사이트로 접속할 수 있는 권한(connect back to the site of its origin)이 허용되어 있다는 것이다. 아주 이상한 닷넷의 한글 번역에 당황하지 말고(더 당황스런 번역이 아주 많다...), 예를 들어 설명하면 이해가 빠르다. 우리의 예제에서 Launcher.exe와 ClientModule.dll 은 localhost.com 사이트에서 다운로드 되었으므로, localhost.com 사이트에 HTTP 호출을 할 수 있지만 다른 사이트들에 대해서는 권한이 없다. 따라서 이들 사이트에 접속하려 하면 SecurityException을 얻어 맞게 된다.

웹 서비스 역시 HTTP 아닌가? 이는 곧, 어셈블리를 다운로드 받은 사이트에 대해 웹 서비스를 호출할 수 있음을 의미하기도 한다. 정말 될까? 간단하게 테스트 해보자(우씨 점점 길어진다... -_-). 웹 프로젝트를 만들고 자시고 하지 말고, SmartClientBasic 가상 디렉토리에 TestService.asmx 파일만 만들어 넣으면 된다(리스트5).

<%@ WebService Language="C#" Class="TestService" %>
using
System;

using System.Web.Services;

using System.Data;

using System.Data.SqlClient;

 

[WebService(Namespace="http://www.simpleisbest.net/apps/smartclientbasic/testwebservice")]

public class TestService : System.Web.Services.WebService

{

    [WebMethod]

    public string TestWebMethod()

    {

        return "웹 서비스를 잘 호출 했습니다.";

    }

 

    [WebMethod]

    public DataSet GetDataSet()

    {

        SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Products",

            "SERVER=(local);UID=Tester;PWD=test;Database=Northwind");

        DataSet ds = new DataSet();

        adapter.Fill(ds);

        return ds;

    }

}

리스트5. 테스트용 웹 서비스

이제 ClientModule 프로젝트에 웹 참조를 수행하자(필자는 웹 참조의 네임스페이스는 WebService로 주었다). 이제 웹 서비스를 호출하고 그 결과를 표시할 QueryDataForm 폼을 추가하고, 데이터 그리드와 버튼을 적절히 올려 놓는다(화면8 참조). 글이 점점 길어지니 힘들고 귀찮아 진다. 설정은 대충 알아서 해라.


화면8. 웹 참조와 데이터 조회용 폼 작성

폼이 열리면서 웹 서비스를 수행하고 그 결과를 데이터그리드(dgProducts)에 표시하도록 코드를 리스트6과 같이 작성한다. 그리고 UIControl 의 테스트 버튼 #3 이 QueryDataForm을 표시할 수 있도록 코드를 추가하자(ShowDialog 호출하면 되는 코드이므로 상세 코드는 생략한다). 컴파일 후, 갱신된 ClientModule.dll 을 다시 웹 서버에 올리고 스마트 클라이언트를 구동해 본다. 결과는 화면9와 같이 아주 멋지게 데이터가 조회 될 것이다.

// 폼 로드 이벤트

private void QueryDataForm_Load(object sender, System.EventArgs e)

{

    // 웹 서비스를 호출하고 그 결과를 데이터 그리드에 표시한다.

    ClientModule.WebService.TestService proxy = new ClientModule.WebService.TestService();

    System.Data.DataSet ds = proxy.GetDataSet();

    dgProducts.DataSource = ds.Tables[0];

}

리스트6. 웹 서비스를 호출하는 코드


화면9. 웹 서비스를 통한 데이터 조회 결과

스마트 클라이언트가 기본 CAS 권한으로 간단하게 데이터를 조회하여 표시하는 것은 문제가 없지만, 조금이나마 복잡한 일들을 하려고 하면 항상 CAS 보안에 걸리기 마련이다. 예를 들어, 우리 나라 사용자들이 그렇게 좋아하는 엑셀 연동은 짤없이 SecurityException을 던져 버릴 것이다. 또한 그리드 역시 닷넷에 기본으로 포함된 그리드가 아닌, 기능 쫌 된다는 것을 쓰려고 해도 역시 SecurityException을 얻어 맞는다. 따라서 스마트 클라이언트를 SI 프로젝트에 적용하려면 클라이언트 PC에 스마트 클라이언트가 CAS 보안 오류 없이 작동할 수 있도록 CAS 설정을 해주어야 한다. 이 방법에 대해서는 다른 포스트에서 설명하기로 하자. 점점 힘이 빠진다... 으윽...

What's Next ?

구체적인 스마트 클라이언트 예제를 다루었으므로, 다음 포스트에서는 스마트 클라이언트의 원리에 대해 살펴보고자 한다. 어떻게 브라우저가 <OBJECT> 태그를 사용하여 마치 ActiveX 처럼 닷넷 User Control을 브라우저 내에 표시할 수 있는 것일까? 어떻게 URL 링크를 통해 독립 스마트 클라이언트 EXE가 수행되는 것일까? 그리고 왜 다운로드 받은 EXE가 아닌 IEExec.exe 프로세스에 의해 호스팅 되는 것일까? 다음 포스트에서는 이러한 질문에 대한 답을 제시할 것이다.


필자에게 이번 포스트의 예제 코드를 요청하지 말라. 이 정도로 자세히 해주었으면 따라 할 수 있어야 한다. 이렇게 설명해 줬는데도 못하겠으면 직업을 바꾸거나 프로그래머로서의 앞길을 심각하게 재고해보기 바란다. 필자가 이렇게 예제 코드에 인색한 이유가 있다. 예제 코드를 다운로드 받아 수행해 보는 것만으로는 그 기술을 자기 것으로 만드는데 큰 도움이 되지 않기 때문이다. 적어도 필자의 생각은 그렇다. 스스로 처음부터 코드를 작성해 보는 것은 특히나 개념을 잡는 부분에서는 매우 중요한 포인트라고 생각한다. 이렇게 필자가 고생을 해서 지식을 알려주니 독자도 예제를 따라 해보는 수고 정도는 해줘야 하는 것 아닌가? 달랑 예제 코드 받아서 돌려보려고 하는 것은 도둑 심보가 아닌가? 필자의 이런 생각에 적절한 반박을 제시한다면 예제 코드를 보내 주겠다. 상단 "Contact" 메뉴는 이럴 때 필자에게 메일 보내라고 만들어 놓은 것이다.

너무 긴 글에 지쳐서 글 내용이 부실하거나 오자가 많을 것 같다. 내용이 이상하거나 오자 등이 발견되면 곧바로 필자에게 꼰질러 주기 바란다.



Comments (read-only)
#좋은 글 잘 보고 갑니다. 다음편도 기대되네요^^ / 최철훈 / 2006-01-09 오전 9:33:00
^^
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / Mr_Lee / 2006-01-11 오후 2:06:00
좋은 강좌 감사 합니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / kdays / 2006-01-11 오후 5:06:00
강좌 잘 봤습니다. 그리고 데브피아 답변 감사합니다.
제가 첨부터 따라해봤습니다.(단 아직 초보라서 버튼을 다 추가 하고 그러진 못했고 라벨만 넣었습니다)
그리고 저는 localhost를 사용하지 않고 따로 서버가 있습니다. (도매인은 없고 ip로만 사용합니다 또한 특정 포트 즉 80포트가 아닌 8001 포트를 사용합니다)
나머지 파일 명 등은 그대로 따라 했습니다.
실행하니까... 이번에는 엑스 박스가 아니라...
html의 textarea 같은 것이 나타 납니다... ㅜ.ㅜ (아까보단 발전(?) 했습니다만...)
제가 어디에서 실수 했는지 아직 잘 모르겠습니다.또한 hosts 파일에는 localhost 밖에 없습니다.. 저처럼 로컬이 아니라면 추가 하지 않아도 되는지 아님 추가 한다면 도매인이 없는경우 어떻게 해야 하는지 모르겠습니다.

그리고 좋은 강좌 잘 읽었습니다. 감사합니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / kdays / 2006-01-11 오후 5:11:00
근데...독립 스마트 클라이언트를 구동하기는 됩니다... 어찌 하오리까.. ㅜ.ㅜ
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2006-01-11 오후 11:56:00
hosts 파일을 사용한 이유는 단순한 테스트를 하기 위함이며 스마트 클라이언트와는 무관합니다.
포트 번호 역시 제가 테스트 해본 결과 80이 아니더라도 잘 작동합니다.
독립 스마트 클라이언트가 잘 작동하는 것으로 보아 IE의 보안 설정 중에 ActiveX를 구동하는데
무엇인가가 막혀 있는 듯 합니다.
브라우저에 임베딩된 스마트 클라이언트는 브라우저의 입장에서 볼 때 ActiveX와 다를 것이 없습니다.
브라우저 보안 설정에 ActiveX가 활성화 되는 것을 방해하는 무엇인가가 있다면 스마트 클라이언트는
나타나지 않습니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / kdays / 2006-01-12 오전 8:21:00
쥔장님 말대로라면 여기 블로그에 있는 셈플들도 제 피씨에선 않되야 되는거 아닌가요?
여기 셈플들은 잘 보이지만 제가 많든 셈플은 textarea 처럼 보입니다.
이건 제 피씨만 그런건 아니고요 제 옆에 있는 피씨도 textarea처럼만 보입니다.
즉 브라우저 문제는 아닌거 같은데요??? ㅜ.ㅜ
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / kdays / 2006-01-12 오전 9:04:00
혹시 제 상황에 대해 알수 있을까 싶어 적어 봅니다.
Microsoft Development Environment 정보
Microsoft Development Environment 2003 Version 7.1.3091
Microsoft .NET Framework 1.1 버젼 1.1.4322 서비스 팩 1

설치된 제품
Microsoft Visual C# .NET
Micorsoft Application Center Test
Visual Studio .NET 용 Crystal Report

제가 사용하는 툴 정보 입니다.... 비베 vc++ 이런거 제외하고 c#만 설치 했습니다..IIS도 제외 했고..
이런게 상관 있는지 잘 몰라서요..
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2006-01-12 오전 9:30:00
이 글의 예제(라이브 예제)는 잘 보이는데, 님이 작성한 예제는 안된다는 말씀이신가요?
그렇다면 소스 혹은 컴파일된 DLL을 저에게 보내 보십시요.

혹시 웹 서버(dll 을 복사한 서버)가 인터넷 영역의 어디에 해당하는지 확인해 보십시요.
브라우저의 왼쪽 하단을 보면 인터넷, 로컬 인트라넷, 신뢰할 수 있는 사이트 등등이 나타납니다.
해당 영역에 대해 ActiveX 활성화 설정이 어떻게 되어 있는지도 확인해 보십시요.

그리고, 글 자체에 대한 피드백이 아닌 개인적인 질문은 가급적 메일(상단 Contact 메뉴 이용)을
이용해 주시면 감사하겠습니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / fmsoul / 2006-01-16 오후 4:24:00
안녕하세요. 죄송하지만 질문을 하나 드려도 될까요.
제가 요즘 Smart Client를 공부하고 있는데 알송달송한 문제때문에 헤매고 있습니다.

버튼 한개와 라벨 한개만 UserControl에 추가한 후 해당 dll을 웹에 올려 테스트를 해보았는데 뜨질 않네요.
X박스는 아니고 객체아이콘 아시죠? 로딩되기전에 뜨는 아이콘이 뜬 채로 더이상 진행하지 않습니다.
님이 만드신 것을 호출하면 잘 되고요.

그래서 게시판내용을 찾아보던 중 .NET Framework 2.0이 설치되면 이게 해당 dll을 로딩한다고 하여서

<configuration>
<startup>
<requiredRuntime version="v1.1.4322"/>
</startup>
</configuration>

를 iexplore.exe.config로 해당 폴더에 저장하여 확인하니 잘됩니다.
(그런데 로딩 시간이 엄청 느리고 버튼과 배경색이 흰색으로 나옵니다. ;;; )

그렇다면 .NET Framework 2.0으로 만들어진 코드는 정상적으로 로딩되어야 하지 않겠느냐 해서
Visual Studio 2005의 C#으로 만들어서 확인해보았는데 동작을 안합니다. 아이콘만 뜨고 더이상 진행을 안하네요.

왜 이런지 조언 좀 부탁드리겠습니다..
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2006-01-16 오후 4:32:00
참고하신 게시판이 데브피아라면... 내용을 아마 제가 작성한 것일 겁니다... -_-;
UserControl 클래스에 ComVisible(true)를 주어 보십시요.
2.0에서는 디폴트로 어셈블리 수준의 ComVisible이 false 입니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / fmsoul / 2006-01-16 오후 4:45:00
빠른 답변 감사드립니다.
그렇다면 주인장님이 만드신 dll을 제 컴퓨터에서 설정없이 실행되는데
왜 제가 만든것은 바로 실행이 안되는것일까요?
주인장님이 만드신 것은 Visual Studio .NET 2003 영문판으로 .NET Framework 1.1 기반으로 돌아갈테고
그렇다면 제 컴퓨터에도 실행이 안되어야 하지 않나요?
참 아리송합니다... T_T 지금 시간이 되신다면 msn메신저에 등록할 수 있는 영광을 주신다면
간단하게 질문을 드리고 싶습니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / dlwoas / 2006-01-18 오후 3:47:00
와우 존경스럽습니다. 좋은글 감사합니다. 우선제소개를 드리자면... 병역특례중인소년이구요 사내intranet구축중인데 smartclient를 이용할려고합니다.

질문이 있는점은.. 전부 따라해보았는데요. 세번째 버튼구현부분에서 계속SecurityException이 뜨는군요...
local로 돌리지않고 서버를 따로 두어 url접근하여 실행해보니 SecurityException뜹니다.
local로 할때는 뜨질않는데말입니다....

님께서 예제로 링크걸어서 올려주신것처럼 local말고도 외부에서 접속하여도 SecurityException먹지않는...것좀 알려주십시요. 꾸벅

혹시나해서 서버컴의 C:\WINDOWS\system32\drivers\etc\hosts 파일에 몇가지 추가하는삽질을해보았지만 되질않는군요..ㅠ ㅠ
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2006-01-18 오후 4:03:00
dlwoas 님...
웹 서비스를 참조할 때 기본적으로 URL이 http://localhost.com 혹은 이렇게 되어 있을 겁니다.
스마트 클라이언트의 기본 CAS 보안 설정은 어셈블리(DLL, EXE)를 다운로드 받은 사이트에 대해서만
네트워크 접속을 할 수 있습니다. 따라서 로컬 컴퓨터가 아닌 다른 컴퓨터에 대해 웹 서비스를 호출하려고 하면
SecurityException 예외가 발생하는 겁니다.

여기에 링크 걸어놓은 예제는 웹 서비스의 URL을 http://www.simpleisbest.net으로 설정해 놓아서 SecurityException이
발생하지 않는 것입니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / dlwoas / 2006-01-19 오후 4:18:00
웹 서비스참조의 URL은 http://서버컴/SmartClientBasic/TestService.asmx?op=GetDataSet 이렇게 되어있습니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / dlwoas / 2006-01-19 오후 4:25:00
헉 이런;;; 저렇게 올라가버리는군요;; 죄송합니다 위의글은 삭제해주세요..."placeholders를 실제 값으로 바꾸어야 합니다"라고 뜨는군요...어디에있는건지...
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2006-01-19 오후 4:49:00
dlwoas 님이 무슨 말씀을 하시는지 도통 알아듣기 힘들군요...

SecurityException이 발생하는 이유를 다시 설명하자면 이미 말씀 드렸습니다.
ClientModule.DLL이 localhost.com 에서 다운로드 되었다면 이 DLL이
네트워크 (socket, HttpWebRequest, 웹 서비스 등)를 통해 액세스 할 수는 사이트는 localhost.com 뿐 입니다.
즉, http://locahost.com 으로 시작하는 사이트는 접속이 가능하다는 것이지요.
반면 다른 사이트는 모두 CAS 보안 오류(SecurityException)가 발생합니다.
당연히 웹 서비스가 localhost.com 이 아닌 다른 서버에 있다면 오류가 발생하는 것이지요.
이해가 되시는지요...

이것을 해결하는 방법은 CAS 설정을 바꾸어 권한을 주는 수 밖에 없습니다.
나중에 올리는 글에서 설명할 것입니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / dlwoas / 2006-01-19 오후 5:03:00
아 해결방법은 나중에올리시는 글에서 알수있겠군요
답변 감사합니다.^^
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / dlwoas / 2006-01-19 오후 5:10:00
아 됩니다... 위의 글들을보다 active x글이있길래 설정을 바꾸었더니 되는군요. 구동하는데 막혀있어서 그랬던것 같습니다. 감사합니다^^
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / hy / 2006-03-22 오후 2:32:00
안녕하세요^^;; smart client를 구현하려고 하는데요..
위의 예제를 잘 따라해봤는데요...
폼이 위의 예제처럼 깔끔하게 나오지 않더라구요..
화면 4처럼 나오지 않고 버튼은 하얗구 글자크기도 커져있구....-_-;;;
화면 5처럼 나오지 않고 링크로 나와서 클릭하면 exe가 실행되더라구요 -_-;;;;
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2006-03-22 오후 3:55:00
기본적으로 ActiveX의 기본 속성(폰트 색상 등)이 브라우저에 의해 ActiveX로 자동으로 설정됩니다.
이 때 설정되는 값은 현재 브라우저의 폰트, 배경색 (CSS, Font 태그 등에 의해 결정되겠죠?)이 사용됩니다.
브라우저에게 있어서 스마트 클라이언트는 ActiveX로 취급되기 때문에 동일한 속성이 설정됩니다.
그래서 폰트와 바탕색이 디자인 타임과 다르게 나타나죠.
이러한 현상을 막기 위해서는 디자인 타임에 디폴트 배경색, 디폴트 폰트를 사용하지 않고
명시적으로 색상을 주거나 생성자에서 코드에 의해 배경색, 폰트를 설정하면 됩니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / woo / 2006-04-05 오후 4:47:00
강좌 정말 감사히 보고 있습니다.위의kdays님과 같은현상(textarea)이 저도 나타났습니다만,
쥔장님의 네임스페이스를 포함..이라는 말에 혹시나 해서 네임스페이스를 고쳣더니 잘 나오네요.
프로젝트를 잘못만들어서 하나 더 만들었는데 잘못만든걸 지워버리고 정상인 것을 이름바꾸기를 햇더니
프로젝트이름은 바뀌고 네임스페이스는 그대로 xx2로 남아 버렷었네요.
남은 강좌도 감사히 보겟습니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 김성경 / 2006-04-13 오후 3:12:00
우선 좋은 강좌 감사드립니다.
Assembly Version 을 변경해도 Client가 새로 다운 받지 않는 문제점을 해결하기 위해 여기저기 돌아 다니다
여기까지 왔습니다. 버젼업을 하니 새로 다운 받지 않고, Codebase를 변경하면(dll의 경로) 다운받는데요.
배포 할때마다 경로를 바꿀수도 없는 문제고, 기존에 다운 받은 assembly를 어떻게 삭제 해야 하는지도 모르겠구
난감합니다...
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2006-04-13 오후 5:44:00
다운로드가 안되는 현상의 원인은 다양합니다만...
서명이 된 경우, 버전이 바뀌지 않으면 GAC Download 캐시의 어셈블리를 사용합니다.
만약 서명이 안된경우는 날짜에 의해 다운로드 됩니다.
Fiddler 등을 이용하여 다시 한번 확인해 보시기 바랍니다.

기존에 다운로드 받은 어셈블리를 제거하는 방법은 gacutil.exe를 사용하면 됩니다.
/cdl 옵션을 주면 Download 캐시의 내용을 모두 삭제해 줍니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / ZK / 2006-05-15 오전 12:11:00
좋은 강좌 감사합니다.
제가 강좌를 보고 유저컨트롤을 만들었는데
그 안에 타이머 개체가 있거든요. 그런데 윈폼에다 컨트롤 넣고 실행하니까.. 타이머가 동작을 안하는데요..
타이머가 째깍할때마다 함수 불러서 작업하게 만들어놨는데..
어떻게 하면 타이머가 동작을 할까요? 초보라 잘 몰라서요.. ^^;
조언 부탁드려요~
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2006-05-15 오전 11:07:00
타이머의 Enabled 속성이 true 인가 확인하십시요.
작동 안 할리가 없는데요... -_-;
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / ralral / 2006-06-16 오후 3:13:00
3번째 버튼의 결과는 .. The request failed with HTTP status 401: Access Denied.
왜그런지 알수있을까요?
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / ralral / 2006-06-16 오후 3:14:00
참고로 같은 로컬에서 웹서비스를 호출했었습니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / ralral / 2006-06-16 오후 3:42:00
자답입니다. iis 설정에서 해당 웹사이트 속성에 익명사용자 체크하면 잘 되는군요. ^^;
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / thankyou / 2006-07-26 오전 9:15:00
고맙습니다. 유상철님 ...프라이드 오브 코리아
#유경상님....고맙습니다. 쌩둥맞게 유상철 선수가 나왔네요.. / thankyou / 2006-07-26 오후 8:07:00
고맙습니다. 꾸벅 -.-
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 박일근 / 2006-08-30 오후 6:17:00
hanbbury@nate.com
혹시 VS2005로 스마트 클라이언트 해보신분 없습니까?
IE에 embed씨끼려니 아무리 해도 안됩니다.

성공하신분 없으세요?~
왜 안되는지 이유를 모르겠습니다.
도와주십시요
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2006-08-30 오후 9:15:00
VS2005를 사용하실 때는 UserControl 클래스에 ComVisible(true) attribute를 추가해 보십시요.
VS2005를 쓰면 AssemblyInfo.cs에 ComVisible(false) 설정이 있어서 어셈블리의 클래스들이
COM을 통해 노출되지 않습니다.
IE는 스마트 클라이언트를 ActiveX로 간주하고 ActiveX 역시 COM 기술이므로 COM을 통해
닷넷 사용자 정의 컨트롤이 보여야만 합니다.
VS2003은 기본적으로 ComVisible(true)이므로 이러한 설정이 필요 없었습니다.

도움이 되셨기를...
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 박일근 / 2006-08-31 오전 9:41:00
hanbbury@nate.com
쥔장님..
빠른 답변에 감사드립니다.

가르쳐 주신대로 Comvisible을 True에 놓고 해 보았는데요~
여전히 빈박스만 나오는데요~
테스트 사이트
http://150.1.1.120:8088/test.html

Fiddle을 사용해보니 다운로드가 안되는데요
IIS에서 설정이 틀린건가요?~
해결해야 다음진도를 가는데..
제 성격상 미치겠습니다..
도와주세요~
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2006-08-31 오후 8:55:00
사이트에 접속이 안되는군요... -_-;
단순히 "다운로드가 안된다"고만 하지 마시고 Fiddler에서 어떤 결과를 표시하는지
알려주시기 바랍니다. 예를 들어 404 오류이면 DLL을 다운로드하기 위해 권한이 없는 경우이며,
혹은 IIS의 가상 디렉터리 설정에 "수행" 설정이 있으면 DLL을 다운로드하는 것이아니라
ISAPI로 인식하서 서버에서 실행하려고 해버립니다(CGI 처럼...)
천천히 다시 시도해 보시길... 화이팅....
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 성공했습니다. / 2006-09-05 오전 10:41:00
그런데요
텍스트 박스로 입력을 받아 DB 조회후 화면에 출력하는 예제를 만들었는데요
에러 가...

See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.TypeInitializationException: The type initializer for 'System.Data.SqlClient.SqlConnection' threw an exception. ---> System.TypeInitializationException: The type initializer for 'System.Data.SqlClient.SqlConnectionFactory' threw an exception. ---> System.TypeInitializationException: The type initializer for 'System.Data.SqlClient.SqlPerformanceCounters' threw an exception. ---> System.Configuration.ConfigurationErrorsException: Configuration system failed to initialize ---> System.Configuration.ConfigurationErrorsException: Root element is missing. (http://150.1.1.120:8088/iexplore.exe.config) ---> System.Xml.XmlException: Root element is missing.
at System.Xml.XmlTextReaderImpl.Throw(Exception e)
at System.Xml.XmlTextReaderImpl.ThrowWithoutLineInfo(String res)
at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.XmlTextReader.Read()
at System.Configuration.XmlUtil..ctor(Stream stream, String name, Boolean readToFirstElement, ConfigurationSchemaErrors schemaErrors)
at System.Configuration.BaseConfigurationRecord.InitConfigFromFile()
--- End of inner exception stack trace ---
at System.Configuration.ConfigurationSchemaErrors.ThrowIfErrors(Boolean ignoreLocal)
at System.Configuration.BaseConfigurationRecor
등등등....

왜 그런가요?
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2006-09-05 오후 1:15:00
Configuration 파일 설정이 이상한듯 하군요. Configuration 파일은 브라우저 임베디드 스마트 클라이언트의 경우
DLL을 다운로드 받은 웹 서버의 루트에서 iexplore.exe.config를 읽도록 되어 있습니다.
(님의 경우 http://150.1.1.20:8888/iexplore.exe.config)
그런데 이 파일이 아예 존재하지 않으면 별다른 문제가 없을 텐데, 존재 하면서 그 내용이 이상한 경우 인듯 합니다.
이 파일이 존재한다면 삭제해 보시기 바랍니다.
그래도 문제가 생기신다면 제 글 '스마트 클라이언트, 그것을 알려주마 (IV) : App Base Directory & Configuration'을
읽어 보시고 명시적으로 Configuration 파일을 지정해 보십시요.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 박일근 / 2006-09-06 오후 4:01:00
쥔장님의 지속적인 답변 너무나 감사드립니다.
말씀하신대로 iexplore.exe.config를 제거 했더니
이젠 다음과 같은 에러가 나오네요
딱보니 permission과 관련된 내용인데
서버는 현재 2003을 사용하고 있습니다.
DB는 MS SQL 2000입니다.
일반 Windows 프로젝트로를 잘 실행이 되는데
dll로 만들어 하니까 이런 문제가 나오네요..

See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.Security.SecurityException: Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
at System.Security.PermissionSet.Demand()
at System.Data.Common.DbConnectionOptions.DemandPermission()
at System.Data.SqlClient.SqlConnection.PermissionDemand()
at System.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
at WindowConTest.UserControl1.GetInfo(Object Caller)
at WindowConTest.UserControl1.BtnSearch_Click(Object sender, EventArgs e)
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
The action that failed was:
Demand
The type of the first permission that failed was:
System.Data.SqlClient.SqlClientPermission
The Zone of the assembly that failed was:
Internet
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2006-09-06 오후 4:12:00
-_-;
기본적으로 스마트 클라이언트는 DB를 직접 액세스할 CAS 권한이 없습니다.
질문하시기 전에 다른 스마트 클라이언트 관련글을 먼저 읽어 보시기 바랍니다.
제가 이런 글들을 쓰는 이유는 글들을 읽어 보고스스로 해결하라고 글을 써 놓은 겁니다.
그러면서 실력이 느는 겁니다.
안되면 무조건 질문을 올리는 것은 결코 실력향상에 도움이 되지 않습니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / Jeremy / 2006-10-17 오후 2:51:00
참 귀한 강좌 잘 읽었습니다.
Stand-Alone exe를 다운하고 실행한 다음 거기서 다시 웹 디렉토리에 있는 dll을 호출할려면 어떻게 하죠?
또 호출한 dll 과 exe 또는 웹 폐이지랑 통신은 어떻게 하는겁니까?
실제로 smart client를 적용해서 개발을 할려니 참 힘드네요.
기본적인거 부텀...
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / ari / 2006-10-23 오후 8:29:00
많은 도움이 되고 있습니다. 친절하면서 거침없는 강의 넘 훌륭하네요.
한가지 질문이 있어서요.
위에처럼 hosts 파일에 localhost.com 추가해줬는데 불구하고
localhost.com 으로 열면 로그인 팝업창이 뜹니다.
원인이 모죠?
권한문제인거같은데 아직 여기까지 안읽어서요..다읽으면 답이나오려나요 ~ ^^;;
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / spi돌이 / 2006-10-31 오후 6:43:00
좋은 강좌글로 많은 도움을 받고 있습니다. 그런데 여러곳을 찾아보아도 해결하지 못한 한가지가 있어 질문을 드립니다.
vs.net 2003 과 vs.net 2005 가 동시에 깔려 있습니다. IE 에 임베디드 되게 프로그램을 했는데, AssemblyInfo.cs 에서 버전을 아무리 올려줘보고..
ComVisible 을 true 로 줘보고, 브라우저를 모두 끄고 태스트 해보고, 심지어 시스템을 재부팅하고 해봐도..소스를 약간 수정후 재 빌드 하고 버전업이 되었을때 새
모듈이 뜨지 않습니다.
단, dll 명을 바꾸고, 시도하면 맨 처음 한번은 브라우저에서 잘 나타나고 작동도 됩니다. 버전 업 안하면 작동 안되는데, 빌드 다시 하고 버전 업만 하면
작동이 안되는 것입니다. 다시 그걸 dll 명을 새롭게 바꾸고 object 태그에서도 바뀐 이름으로 참조하면 또 처음 한번은 작동하구요..
무엇이 문제일가요?
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / spi돌이 / 2006-10-31 오후 7:29:00
ps. 바로 위 내용을 쓴 사람인데요... 설명이 좀 부족한듯 하여서요.. 개발은 vs.net 2005 에서 하였습니다. 그래서 .net 프레임워크의 버전문제로 인한것은 아닌듯 합니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / spi돌이 / 2006-11-02 오후 6:45:00
ps. 바로 위의 글과 그 위의 글 쓴 사람인데요. 몇가지 좀더 자세한 상황 설명을 덧붙입니다. 위의 버그를 수정해볼려고 이 연재글의 마지막회 까지 다 봤는데도 현재 버그를 수정 못한 상황입니다. 그런데, 몇가지 원인인것처럼 보이는 단서를 발견하였는데요.. 정성태님의 assembly deployment (1) 처럼 태스트를 해보면 fiddler 로 내용을 확인 해본 결과 저의 상황에서는 항상 HTTP/1.1 200 OK 이 떨어지면서 항상 받아 집니다. 브라우저 설정을 매번 다운받기가 아닌 브라우저 디폴트인 auto 로 해놓았는데도 말이죠..
그리고 정성태님의 스샷과 제 fiddler 의 차이점은 다운받아지는 dll 의 하단부 header 내용에서 entity 에 정성태님은 총 4개가 보이고 마지막 두개가 last modified 와 e-tag 정보인데 저는 그 두 필드가 아예 존재하지 않고 content-type 과 content-length 만 보여진다는 것입니다. 저는 윈도우 2003서버에 윈도우 익스플로러 7.0 베타 를 써서 vs2003 과 vs2005 동시에 깔린 상태에서 vs2005 로 태스트를하고 있는데요..아마도 이 환경에서만의 뭔가 다른 원인 때문인가요? 누구 비슷한 경험 하신분 조언 부탁드립니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / spi돌이 / 2006-11-03 오후 2:57:00
ps. 위 문제 해결 되었습니다..^^ 감사합니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2006-11-03 오후 4:00:00
앗... 해결하셨나요?
IIS 에서 만료 시간 설정 문제가 아닐까하고 답글을 달려고 했는데...
해결하셨다니 다행입니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 신세원 / 2006-11-06 오후 7:26:00
예제문서 잘봤습니다..!!
하다보니 버젼관리가 무엇보다 중요할것 같아서 프로젝트에서 조금씩 프로그램 변경후 Assemblyinfo.cs에 있는 [assembly: AssemblyVersion("1.0.0.0")]의 값을 임의로 바꾸고 하니깐 웹에서 실행이 갑자기 안되네요..
IExplore.exe 프로세스 종료후 Dll파일 업데이트하고 실행했는데도 컴포넌트표시아이콘만 뜨네요.
제일 초기 프로젝트생성후(버젼수정전)에는 이상없이 잘 돌아가는데, 수정후에는 에러라??
참고로 환경은 Visual Studio 2005에서 테스트하고 Aspx파일로 실행테스트하고 있습니다.
답변부탁드려요~~
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2006-11-07 오전 10:15:00
스마트 클라이언트가 구동되지 않는 상황은 매우 다양합니다.
설명하신 내용으로는 무엇이 문제인가 알아내기 대단히 힘들군요... -_-;
다음 글을 참고하시어 문제 및 해결을 시도해 보시기 바랍니다.

스마트 클라이언트, 그것을 알려주마 (V) : Trouble Shooting
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 허성남 / 2006-11-08 오후 7:42:00
예제 문서를 잘 봤습니다.
닷넷 2005,프렘워크가 2.0인데, Launcher.Exe 참조하는 ClientModule.dll이 같이 다운된다고 하였는데 왜서인지 ClientModule.dll이 다운되지 않네요..
제가 무슨 Setting을 잘 못 했는지 알려주시기 바랍니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 허성남 / 2006-11-09 오전 10:26:00
예제 문서를 지금 보고 따라하고 있는데요..
한가지 질문이 있습니다.
닷넷 2005,프레임워크 2.0으로 예제를 하고 있습니다.
http://localhost/SmartClientBasic/SmartClient.html 로 하면 정상적으로 ClientModule.dll 가 다운되고 있는데.
제 IP로 매핑시켜 http://222.169.19.123/SmartClientBasic/SmartClient.html 로 하면 ClientModule.dll 가 다운되지
않으면서 애러가 생깁니다.
혹시 무슨 원인인지 알려주시기 바랍니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2006-11-09 오전 11:05:00
단순히 "애러" 난다는 말로는 어떤 도움도 드릴 수 없습니다.
제가 이런 글을 쓴 이유 중 하나로 그런 질문을 받기 싫어서 입니다.
나머지 글들을 천천히 모두 읽어 보시면 원인을 아실 수 있을 겁니다.

그리고... 저는 질문을 받기 위해 24시간 대기하고 있는 사람이 아니랍니다.
"알려주시기 바랍니다" 라고 하시면 "네~"하고 알려주는 사람도 아닙니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 최현정 / 2006-11-13 오후 6:30:00
안녕하세요. 스마트 클라이언트 때문에 많이 고생하다가 쥔장님의 강의를 보고 많은 도움을 받아 플젝을 진행하고 있습니다. ^^
플젝을 수월히(?) 진행하고 있다가, 문제가 발생하여 조심스럽게 문의드립니다.

저는 독립수행하는 Stand-alone Smart Client 를 사용하고 있습니다.
Smart Client (.exe)를 실행할 때 필요에 의해 Argument를 넘기면 다음과 같은 Exception 이 발생합니다.

Response.Redirect("http://hjchoi/ClickWeb/ClickWord.exe"); <-- 정상동작
Response.Redirect("http://hjchoi/ClickWeb/ClickWord.exe?Type=DRAFT"); <-- 오류동작

Exception 메세지를 보니 http://hjchoi/ClickWeb/ClickWord.exe.config 파일이 아닌
http://hjchoi/ClickWeb/ClickWord.exe?Type=DRAFT.config 파일을 참조하면서 발생되는 오류인거 같습니다.
그래서 강좌에서 본 대로 AppDomain.CurrentDomain 에 BaseDiretory 와 ConfigFile 의 값을
정상동작할 때와 같이 변경하였습니다.

그런데도 계속 오류가 발생되네요..(가끔 디버깅할때는 정상적으로 될때도 있습니다.)
혹시 해결 방법이 없을까요?
아니면..stand-alone 형태의 smart client 에서 Argument 를 넘기는 다른 방법이 없을까요?

바쁘시겠지만, 답변 부탁드립니다. ^^;


System.TypeInitializationException: The type initializer for 'System.Data.SqlClient.SqlConnection' threw an exception. ---> System.TypeInitializationException: The type initializer for 'System.Data.SqlClient.SqlConnectionFactory' threw an exception. ---> System.TypeInitializationException: The type initializer for 'System.Data.SqlClient.SqlPerformanceCounters' threw an exception. ---> System.Configuration.ConfigurationErrorsException: Configuration system failed to initialize --->
System.Configuration.ConfigurationErrorsException: Data at the root level is invalid. Line 1, position 1. (http://hjchoi/ClickWeb/ClickWord.exe?Type=DRAFT&DepCode=10000&GrpCode=G0007&UsrCode=bssn&FrmCode=FR001&FrmPath=Forms/FR001.doc.config line 1) --->
System.Xml.XmlException: Data at the root level is invalid. Line 1, position 1.\r\n at System.Xml.XmlTextReaderImpl.Throw(Exception e)\r\n at System.Xml.XmlTextReaderImpl.Throw(String res, String arg)\r\n at System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace()\r\n at System.Xml.XmlTextReaderImpl.ParseDocumentContent()\r\n at System.Xml.XmlTextReaderImpl.Read()\r\n at System.Xml.XmlTextReader.Read()\r\n at System.Configuration.XmlUtil..ctor(Stream stream, String name, Boolean readToFirstElement, ConfigurationSchemaErrors schemaErrors)\r\n at System.Configuration.BaseConfigurationRecord.InitConfigFromFile()\r\n --- End of inner exception stack trace ---\r\n at System.Configuration.ConfigurationSchemaErrors.ThrowIfErrors(Boolean ignoreLocal)\r\n at System.Configuration.BaseConfigurationRecord.ThrowIfParseErrors(ConfigurationSchemaErrors schemaErrors)\r\n at System.Configuration.BaseConfigurationRecord.ThrowIfInitErrors()\r\n at System.Configuration.ClientConfigurationSystem.EnsureInit(String configKey)\r\n --- End of inner exception stack trace ---\r\n at System.Configuration.ConfigurationManager.GetSection(String sectionName)\r\n at System.Configuration.PrivilegedConfigurationManager.GetSection(String sectionName)\r\n at System.Diagnostics.DiagnosticsConfiguration.GetConfigSection()\r\n at System.Diagnostics.DiagnosticsConfiguration.Initialize()\r\n at System.Diagnostics.Switch.InitializeConfigSettings()\r\n at System.Diagnostics.Switch.InitializeWithStatus()\r\n at System.Diagnostics.Switch.get_SwitchSetting()\r\n at System.Diagnostics.TraceSwitch.get_Level()\r\n at System.Data.ProviderBase.DbConnectionPoolCounters..ctor(String categoryName, String categoryHelp)\r\n at System.Data.SqlClient.SqlPerformanceCounters..ctor()\r\n at System.Data.SqlClient.SqlPerformanceCounters..cctor()\r\n --- End of inner exception stack trace ---\r\n at System.Data.SqlClient.SqlConnectionFactory..ctor()\r\n at System.Data.SqlClient.SqlConnectionFactory..cctor()\r\n --- End of inner exception stack trace ---\r\n at System.Data.SqlClient.SqlConnection..cctor()\r\n --- End of inner exception stack trace ---\r\n at System.Data.SqlClient.SqlConnection..ctor(String connectionString)\r\n at WordLibrary.WordForm.SetGlovalLoginInfo(String strDepCode, String strGrpCode, String strUsrCode)"

#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 김훈동 / 2006-11-29 오전 12:24:00
저의 경우는 argument 에 값을 넘기는 게 아니라 public 메소드를 만들어놓고 값을 넘겨 버린답니다. javascript 를 이용해서 값을 넘길 수 있습니다. smart client 가 뜨고 나서
거의 동시에 필드값을 메소드를 통해서 즉 setter 등을 이용하여 넘기면 해당값을 setter 메소드가 내부 private 필드에 채워놓게 되고 그 이후에 다른 액션을 통해서 해당 값을 가지고 핸들링 되게 해놓으시면 됩니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2006-11-29 오전 9:12:00
김훈동님// 브라우저 임베디드 스마트 클라이언트라면 public 속성 혹은 메쏘드를 이용할 수 있습니다만
독립 스마트 클라이언트는 그런 식을 사용할 수 없답니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 지영 / 2006-12-07 오전 9:30:00
ㅇㅇㅇ
#스마트 클라이언트는 웹서버 없이 단독 실행이 안되나요? / 윤광수 / 2006-12-20 오전 11:17:00
꼭 IIS나 머 기타 웹서버에서 호출 하여야만 작동하고, 단순 스탠다스에서 일반 CAB 파일을 <object> 태그를 이용하여 호출하여 사용하듯이 단순 하게 그냥 dll, 이나 exe 파일을 호출 하여 사용할 수 없나요?
즉, test.html 파일과 *.dll, *.exe 만 가지고 실행할 수는 없는지요? 당연히 닷넷프레임워크는 로컬에 깔려있다는 전제하에서 입니다...
초보라 궁금하네요 ^^
#스마트 클라이언트 테스트 / 윤광수 / 2006-12-20 오전 11:42:00
현재 테스트 하고 있는 웹서버는 IIS가 아닌 다른 웹서버에서 테스트를 하고 있는데 실행이 안됩니다.

만일 반듯이 웹애프릴케션과 웹서버를 통해서만 실행이 된다면, 꼭 IIS에서만 실행 되나요? 다른 웹서버를 통해서 호출하면
실행이 안됩니다...
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / Dick Brunebjerg / 2006-12-21 오전 2:32:00
Hi there,
I can't read any of the above, but this is the only site in the world where I have found something that I think might help me, so if someone would be so very kind to translate it for me - thanks.
From above I can see that someone is getting the error: "Configuration system failed to initialize" in connection with starting an Application via a URL contaning a query after the actual application name.
I am having this exact problem - does the above suggest why + a solution to this ?
Thanks.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2006-12-21 오전 11:25:00
윤광수님. IIS가 아닌 웹 서버에서도 스마트 클라이언트는 작동합니다.
꼭 웹 어플리케이션이 아니어도 상관없습니다. 즉, .htm 파일만으로도 스마트 클라이언트는 잘 작동한다는 것이지요.
예를 들어 Apache에서 사용하고 계시는 분도 있습니다만...
#Dick... I'm not a navtive speark nor writer... -_-; / Blog Owner / 2006-12-21 오전 11:41:00
Hi... Dick
I'm a author of this article. This article is about writing a smart client application based on NTD(no-touch-deployment) technology.
I'm not a native english speaker nor writer. so... I cannot afford to translating it.
I'm sorry about that.

The error, "Configuration ...", means that the configuration file is invalid or corruptted.
Basically, the URL of a applicaiton must NOT have a query beacause CLR try to use a url of configuration file
with the query.
If you really want to use the query string, try to use http handler with .config extention, which ignores the query string and
just downloads the configuration file.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / Abysslover / 2006-12-23 오전 1:16:00
Hi Dick..
how about using public setter method to set the configurations name.
You can using smart client with Javascript.
For example..
namespace MyControlNamespace {
private string configureFile = "";
public class MyControl {
public void setConfigurationFile(string filename) {
this.configureFile = filename;
}
}
}

<object id="myControl" classid="MyControlNamespace.dll#MyControlNamespace.MyControl"></object>
<script language="Javascript">
myControl.setConfigurationFile("app-config.xml");
</script>

you can using app-config.xml for your application configuration with xml manipulatiing API..
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / Blog Owner / 2006-12-23 오전 2:25:00
Hi Abysslover....
I think that Dick did not use the <OBJECT> tag but <A> tag or URL shortcut.
When the smart client uses <A> tag or URL shortcut, then CLR try to use the configuration file URL with query string.
The Url with query string results in invalid configuration file URL.
For example, the URL of exe were "http://server/App.exe?Param=value", then the URL of configuration file will be
"http://server/App.exe?Param=value.config", which may cause an exception regardless of custom configuration file.
Any idea ?
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / Dick Brunebjerg / 2006-12-31 오후 9:31:00
Hi all,
Thanks for your suggestions.
I am not sure why this problem occurs. I would say that its a bug (perhaps due to an unforeseen use).
However, I solved the issue by having the SmartClient Application first detect the information that I need from the Query part, and the delete this part.
Delting it was, however, not straightforward since the getter method of AppDomain.CurrentDomain creates a copy of the CurrentDomain, and any changes to this copy doesn't affect the real CurrentDomain.
So I used Reflection in order to access the private internal version and changed this.
This solved the problem.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / wolfjeong / 2007-01-26 오후 12:23:00
웹에서 <OBJECT>로 베포시 ... 에 웹페이지 에서 스마트 클라이언트에 값을 전달 할수 없나요.??
javascript 에서요...
이렇게 사용해야 하는 이유는
특정 ID를 통해 데이타를 보여 주는 것이 달라지기 때문이데요..
방법이 없나요.???
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2007-01-26 오후 9:41:00
UserControl 이 public 속성을 제공하면
이 속성을 자바 스크립트에서 액세스할 수 있습니다.
OBJECT 태그를 사용하는 스마트 클라이언트는 브라우저나 자바 스크립트에게는 ActiveX와 다를 것이 없습니다.
따라서 스마트 클라이언트의 public 속성 혹은 public 메쏘드를 자바 스크립트로
쉽게 액세스 할 수 있습니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / hwchul / 2007-02-10 오전 8:46:00
아래 내용을 실행하면 다운로드창이 뜹니다~ 저만 그런듯 한데... ㅡㅜ
방법이 있나요??
늘 좋은글 감사합니다.......

<html>
<head>
<title>스마트 클라이언트 따라 하기 예제</title>
</head>
<body>
<h1>Stand-alone Smart Client Example</h1>
<p>다음은 URL 링크를 사용하여 닷넷 윈폼 어플리케이션을 수행하는 스마트 클라이언트 예제 입니다.</p>
<a href="Launcher.exe">독립 스마트 클라이언트 수행 !</a>
</object>
</body>
</html>
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2007-02-10 오후 9:21:00
닷넷 프레임워크 2.0의 경우 신뢰된 사이트가 아니면 다운로드 창이 뜬답니다.
-_-;
신뢰되는 사이트로 등록해 보십시요.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 데이빗 / 2007-02-24 오후 1:43:00
쥔장님
Stand Alone 위에 나와있는데로 했는데
로컬에서 할 때는 아주잘 돌아가는데 서버에 설정해 놓고 해 보니까 돌아가질 않아요
서버를 신뢰되는 사이트로 등록해 보았습니다.
혹시 보안설정 같은 것들을 해 줘야하는 건가요??
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / lobotomi / 2007-03-10 오전 12:36:00
안녕하세요~ 마소 잡지에서 보고 이곳까지 왔습니다~ 실제 위의 튜토리얼대로 따라해 보았는데,
SmartClient.htm 까지는 아무런 문제 없이 잘 보입니다~
SmartClient2.htm 에서 바로 위에 질문하셨던 hwchul님과 같은 문제가 발생해서요~
(제가 아직 미숙한 프로그래머라는 점을 감안하여 좀 답답하시더라도 양해를 부탁드립니다. ^^;; )

http://localhost.com/SmartClientBasic/ 를 신뢰된 사이트로 등록해 보기도 했는데.;;
역시나 다운로드 창이 뜹니다~ 정확히 창 제목은 "파일 다운로드 - 보안경고" 구요, 실행을 누르면
Launcher.exe 파일에 대해 알수 없는 게시자라는 보안 경고 창이 또 뜹니다~ 또 다시 실행을 누르면

"Launcher에 문제가 발생했기 때문에 프로그램을 종료해야 합니다. 불편을 끼쳐드려 죄송합니다." 창이 뜨면서
오류 보고서를 보내겠냐고 질문하는데요, 오류 보고서를 보면 아래와 같습니다.

EventType : clr20r3 P1 : launcher[1].exe P2 : 1.0.0.0 P3 : 45f158a7
P4 : launcher P5 : 1.0.0.0 P6 : 45f158a7 P7 : 9 P8 : f
P9 : system.io.filenotfoundexception

filenotfoundexception 가 뜨길래 혹시나 하여 프로그램명을 launcher1.exe 로 변경해서 테스트 해보았는데도
똑같은 현상이 발생합니다~ 위에 댓글들을 훑어 보았는데 닷넷2005에서는 ComVisible(true) 로 설정해야 한다고 하셔서
.cs 파일 안의 false 를 true 로 바꾸기도 했습니다만~ 마찬가지입니다. ㅠ ㅠ
얼핏 위 글들중에서 브라우저 임베디드에서는 dll 이 잘 다운로드 되는데
스탠드어론에서는 dll 이 다운로드 되지 않는거 같다는 글을 본것 같은데요...
그것에 대한 답변은 없었어서요... 혹시 제 문제에 대해서 어떤 문제인지 아신다면 조언을 부탁드리겠습니다~
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2007-03-11 오전 2:32:00
데이빗님 그리고 lobotomi 님
독립 스마트 클라이언트가 수행되지 않고 다운로드 창이 뜨는 상황은
(적어도 제가 아는한) 닷넷 프레임워크 2.0이 설치된 상황에서 exe를 다운로드 하는 사이트가
신뢰할 수 있는 사이트에 등록되지 않은 경우입니다.
파일 다운로드 대화 상자가 뜬다면 그건 스마트 클라이언트 상황이 아님을 유의하십시요.
(즉, 다운로드 후 그것을 수행하는 상황입니다)
여기 나온 예제대로 했다면 보안 설정은 필요 없이 작동합니다.
그리고 lobotomi 님의 경우는 스마트 클라이언트로 수행된 것이 아니기 때문에 FileNotFound가 발생하는 겁니다.
스마트 클라이언트에 대한 다른 글들을 좀 더 읽어 보시고(특히, trouble shooting에 대한 글)
로그 파일이나 Fiddler의 결과를 살펴보시기 바랍니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 천상준 / 2007-03-17 오후 9:49:00
예제 한번 실행 해보려고 몇시간째 헤매였네여...
음 스마트 클라이언트가 아직은 웹서버의 영향을 많이 타는것같습니다.
windown 2003 영문 서버와 200xp 톰캣 4.x에서 계속 왜 다운로드가 안되나 테스트를 해봤는데.
결국인 안되었구여..
마지막에 2005 자체웹으로 성공했네여.
2005에서는 ClientModule.dll.config 이 파일이 없으니까 브라우저에 로드가 안되는것 같네여.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2007-03-18 오후 10:42:00
천상준님...
스마트 클라이언트는 웹 서버와 전혀 관계가 없는 클라이언트 기술입니다.
DLL이 다운로드 안되는 이유는 순전히 웹 서버의 설정 문제이며 스마트 클라이언트의 문제가 아니랍니다.
톰캣이 DLL을 다운로드 해 주지 않도록 설정되어 있거나 다운로드 되는 DLL의 Content-type 설정에 문제가
있을 가능성이 매우 높습니다. 확인해 보시기 바랍니다.
그리고 dll.config 파일의 유무와 관계없이 로드는 됩니다만... -_-;
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 천상준 / 2007-03-21 오후 5:00:00
쥔장님 얘기가 맞았네여..
톰캣의 web.xml에 dll Content-type 을 지정해주니.. 제대로 다운로드가 되는군여..
dll.config두 제가 html에 Configuration을 지정해줘서 그런거였습니다.
감사합니다.~
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 김재경 / 2007-03-30 오후 5:08:00
첨에 실행이 안되서 iis에서 http 압축을 사용안함으로 하니까 잘되는군요 ㅡㅡ;
뭐가 문젤까요?
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2007-03-31 오후 11:28:00
불행하게도 DLL 이 압축되면 스마트 클라이언트는 작동하지 않습니다.
안타까운 일이지요... -_-;
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / wind / 2007-04-02 오전 11:03:00
예제를 보고 따라해보면서 아주 단순한 예제를 만들어서 적용해 보고 있는데요.

Control의 public 속성에 접근을 못하는데.. ( 매번 그런건 아닙니다... -_-;; 되던게 안되고 그러더군요.. )

다음과 같은 간단한 예제에서 잘못될게 있을까요? 다운로드 안되는것도 안되고..

# Control

namespace WebControl
{
public partial class UserControl1 : UserControl
{

public string strTest = "test";

public UserControl1()
{
InitializeComponent();
}


public string test()
{
return "test";
}
}
}


#Web

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>제목 없음</title>

<script language="javascript">
function gogo()
{
alert(form1.ctlTest.strTest);
}
</script>

</head>

<body>
<form id="form1" runat="server">
<div>
<object id="ctlTest" classid="WebControl.dll#WebControl.UserControl1" width="100%" height="50"></object>


<input type="button" id="btnTest" name="btnTest" value="클릭" onclick="return gogo();" />

</div>
</form>
</body>
</html>





#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2007-04-02 오전 11:28:00
wind 님 \\ VS2003의 프로젝트 템플릿에서는 ComVisible에 대한 기본 설정이 없었습니다.
하지만 VS2005의 템플릿에는 [assembly:ComVisible(false)]가 들어있지요.
그래서 속성에 접근이 안될 겁니다.
클래스에 ComVisible(true)를 주어 보십시요.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / wind / 2007-04-02 오전 11:43:00
빠른 답변 감사드립니다. (__);

첨에 테스트 했을때.. Comvisible(true) 로 해서 성공했다가..

다른거 테스트 하다가 ComVisible을.. false 로 셋팅해놨었군요..

답변 감사드립니다. (__)
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / Zzang / 2007-07-10 오후 5:52:00
1번을 구현중인데.. 사용자 컨트롤을 만들어서 참조하는 것까지 했습니다. 참조하고 빌드 시키니깐 2가지 경고가 나옵니다.

경고 1 'C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\SmartClient Basic\ClientModule\ClassLibrary1\UIControl.cs'의 'ClassLibrary1.UIControl' 형식이 'c:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\SmartClient Basic\ClientModule\ClassLibrary1\bin\Debug\ClassLibrary1.dll'의 가져온 형식 'ClassLibrary1.UIControl'과(와) 충돌합니다. 'C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\SmartClient Basic\ClientModule\ClassLibrary1\UIControl.cs'의 형식을 사용합니다. C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\SmartClient Basic\ClientModule\ClassLibrary1\Launcher.Designer.cs 55 17 ClientModule

경고 2 'C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\SmartClient Basic\ClientModule\ClassLibrary1\UIControl.cs'의 'ClassLibrary1.UIControl' 형식이 'c:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\SmartClient Basic\ClientModule\ClassLibrary1\bin\Debug\ClassLibrary1.dll'의 가져온 형식 'ClassLibrary1.UIControl'과(와) 충돌합니다. 'C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\SmartClient Basic\ClientModule\ClassLibrary1\UIControl.cs'의 형식을 사용합니다. C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\SmartClient Basic\ClientModule\ClassLibrary1\Launcher.Designer.cs 31 49 ClientModule

라는 경고문이 나오네요.!! HTML로 띄워봤는데. 빈화면이 나오고요. 여러번 해봐도 안되요!! 왜 그런거죠??
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2007-07-10 오후 6:47:00
글쎄요... 프로젝트 구성이 잘 못되신듯... 다시 한번 잘 따라서 해보시길.... -_-;
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 백군 / 2007-07-12 오후 7:36:00
SmartClient2.htm 만들고 나서.. 가상 디렉토리 밑에 옮기고 나서.. 실행을 하면.. 링크 걸린 글을 누르면..
팝업이 실행이 됩니다..
하지만.. 버튼 세개가 다 비활성화가 되버려요.. 왜 그런지.. 모르겟어요..
아.. 그리고.. 솔루션 바로 밑에 SmartClient.htm은 실행을 하면.. 글자 밑에.. 텍스트 아리아 처럼 띄고.. 만든 내용이 나오지 않아요..
좀 부탁 드립니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2007-07-13 오전 1:42:00
글쎄요... 왜 버튼 세개가 다 비활성화가 되는지 저도 잘 모르겠습니다.
그런 경우는 저도 처음 듣는지라...
브라우저 임베디드 스마트 클라이언트가 텍스트 영역처럼 나오는 것은
다운로드가 제대로 안되어 있다던가 OBJECT 태그의 값을 잘못 준 경우입니다.
제 글중 Trouble Shooting 글을 참고하시어 다시 한번 시도해 보시기 바랍니다.
건투를 빕니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 현양 / 2007-07-13 오전 10:33:00
버튼 비활성화 되는게 안돼서.. 다시 첨부터.. 만들었습니다. 제가.. 혹시나.. 머 잘못한게 잇을꺼 같아서..
그래서.. 하니가 활성화가 되더라구요..
그런데.. 다운로드 상자가 뜨는데.. 괜찮은 건지... 저장을 하지 않고 실행을 누르면 되거든요..
그리고.. 지금 현재.. 제가.. 멋도 모르고.. ASPNET 계정에 패스워드를 바꿨는데.. 그 뒤로.. 웹 서비스가 참조가 되지 않네요..다시 기존의 패스워드로 바꿨는 데도 말이죠..
에러 메시지 는 아래와 같습니다.

config 파일의 processModel 섹션에 입력한 사용자 이름 및 암호가 잘못되었으므로 aspnet_wp.exe를 시작할 수 없습니다.

인터넷에 찾오니까 유저네임을 SYSTEM 으로 바꾸라고 해서. 바꿨는데도 되질 않네요.. 조언 부탁드립니다..
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 현양 / 2007-07-13 오후 1:07:00
위에꺼는 해결을 했습니다. 다시 원래대로 패스워드를 변경했습니다.

테스트 버튼 3을 클릭햇을때 폼이 호출되는 소스는 없네요..
Application.Run(new ClientModule.QueryDataForm());
이렇게 하니까.. 에러가 뜨구요..
어떻게 호출하는 건지.. 잘 모르겠습니다..
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 현양 / 2007-07-13 오후 3:47:00
QueryDataForm frm = new QueryDataForm();
frm.Show();

하니까 되군요..

작성한글을.. 삭제할 수는 없나보네요.. 이궁.. ㅜㅠ 죄송합니다.
#문제가 생겨서 그러는데요^^ 해결해주심 감사하겠습니다. / yhk / 2007-08-08 오후 4:17:00
안녕하세요^^ 저도 스마트클라이언트에 관심이 생겨서 열심히 하나하나 따라하고 있어요^^ 만들기 힘드셨을것 같은데 알아듣기 쉽게 만들어주셔서 도움이 되고 있습니다.
제가 막히는 곳이 있어서 하나 물어보려고 합니다.
IE Embedded Smart Client Setup & Test 이 부분에서
마지막으로, C:\Windows\System32\Drivers\Etc 디렉터리의 hosts 파일에 다음 항목을 추가한다
여기에서 hosts에다가 똑같이 127.0.0.1 localhost.com # 스마트 클라이언트 테스트용 호스트 이름
를 넣어주었는데요 암호창이 자꾸 떠서요, administrator 에 암호는 제 컴퓨터 암호를 똑같이 넣어줘도 안되구요.
그래서 그냥 localhost를 쓰니까 잘 뜨긴 뜨는데요, 위의 안되는원인이 어떤 부분인지 모르겠어서 이렇게 물어봅니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 용우 / 2007-08-14 오후 4:03:00
smart client 만들때 vb.net의 class 로 만들면 안되나요?
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 알려주세요 (__) / 2007-08-16 오후 5:31:00
오류 1 진입점에 적합한 정적 'Main' 메서드가 'C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\SmartClient Basic\SmartClient Basic\obj\Debug\SmartClient Basic.exe' 프로그램에 없습니다. SmartClient Basic
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2007-08-16 오후 6:35:00
용우님// VB.nET 클래스로 만들어도 됩니다.

알려주세요님// 말 그대로 exe에 Main 메쏘드가 없기 때문입니다. Main 메쏘드가 존재하는지
그리고 프로그램 설정에서 시작 클래스 및 메쏘드 설정을 제대로 해 주셨는지 확인해 보세요.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / suemirr / 2007-08-17 오후 8:32:00
방금 예제를 해보았습니다. 다 되는데 버튼 배경색이 흰색으로 나오네요.
런처에서 수행하면 제대로 나오구요. 혹시나 해서 색도 지정했는데 제대로 안나오네요.
ComVisible(true)도 해줬습니다. 뭔 문젠지를 모르겠네요. ㅜㅜ;

그나저나 내용 정말 좋네요. 혹시 관련 서적 추천해주실 수 있으신가요??
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / suemirr / 2007-08-17 오후 9:04:00
일단 색깔 흰색으로 나오는건 해결하였습니다.
명시적으로 색깔과 폰트 지정후에 올려도 새로 받지 않으므로 안되던거군요.
다운로드 받은 dll 파일의 유효시간 같은게 있는지요. 파일이 업데이트 되었을 때 Client에서 다시 받았으면 좋겠는데.. 훔
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / suemirr / 2007-08-17 오후 9:13:00
위 내용은 해결하였습니다. 다시 글을 찬찬히 읽어보니 익스플로어를 완전히 닫아야하는군요.

또 하나의 문제 발생이군요. 로컬에서 되는데 외부에선 안되는군요. 흠. IIS 설정 문제인가.. ㅜㅜ;
설정에서 실행 권한에 따라 다음 상황이 발생합니다.
없음 : 로컬 성공, 외부 실패
스크립트 전용 : 로컬 성공, 외부 실패
스크립트 및 실행 파일 : 로컬 TextArea 박스, 외부 TextArea 박스

일단 이것저것 막 해보는 중입니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 이방은 / 2007-08-20 오후 6:13:00
헐헐헐..
경상님 영어 실력이 대단하시군요...
저 위에 Dick 이라는 친구는...한글을 읽을수 있는데...쓰지는 못하는 친구인가..
아니면 외국에 있어서 한글타이핑을 못하는 한국인인가..궁금해 지네요..@.@
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / darkwolf / 2007-11-14 오후 4:09:00
Smart Client를 공부하고 있습니다. 예제를 보고 따라해보고 있는데 버튼 1, 2는 실행이 됩니다.
근데 버튼 3의 과정 진행중에 웹참조가 도무지 되지를 않습니다.
현재 XP를 쓰고 있고, IIS및 Framework2.0도 설치가 되어있습니다.
예제파일을 폴더에 작성해서 넣은 다음에 웹참조 추가를 누르니 계속 에러가 나네요...
무슨 문제일까요???
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / under76 / 2008-10-20 오후 5:57:00
강좌 잘보고 있습니다.
님이 강좌한 내용을 그대로 따라해보고 있는데 ClientModule을 생성하여 Launcher 어플에 [추가 참조]를 하면 Tool Box에 My User Control에 control이 추가가된다고 하는데요 저는 그렇게 따라해도 Tool Box에 추가가되지 않네요..ㅠㅠ
계속하고 있는데
제가 지금 사용하고 있는 버전은 visual studio 2005와 visual studio 2008입니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 블로그쥔장 / 2008-10-20 오후 9:06:00
정상적으로 DLL이 빌드되었고 이 DLL내에 public 클래스의 UserControl 이 존재하면
이 DLL을 참조하는 프로젝트의 Form 디자이너를 구동하면 왼쪽
툴 박스에 추가가 되어야만 정상인데.... 이상하군요... -_-;

만약 정말 안보이신다면 수동으로 추가해주시는 방법 밖에 없습니다만... -_-;
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 권택환 / 2008-10-21 오전 9:41:00
스마트 클라이언트에 대해 깨우침을 얻고 가네요~
감사합니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 윤주석 / 2008-10-31 오전 1:29:00
예제조차 제대로 안되서 몇일을 삽질을 했습니다.
익스플로어 상에서 컨트롤이 나와야 하는 자리에 엑스박스가 계속 떠서요.
Fiddler로 보면 웹페이지는 200 으로 열리는데 컨트롤이 담긴 dll 올릴때 206 이라고 메세지가 올라오더라구요.
임대 웹서버가 문제였습니다. 서버쪽에 뭔가 제한을 걸어둔건지...
다른 회사의 웹서버에 테스트 하니 바로 되는 군요...
그래서 이제 시작인건데... 시작도 하기전에 몇일씩 진을 뺏더니 힘들어요 ㅜㅜ
혹시 저와 같은 경험을 하시는 분을 위해 조금 적어 봅니다.
도움이 되길 바랍니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 이기웅 / 2008-11-18 오후 5:02:00
잘보고 갑니다. ^^
댓글을 통한 질문과 답변이 본문만큼이나 길군요.
쥔장님의 친절함 때문이 아닐까 합니다.
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 금정민 / 2009-02-12 오후 6:22:00
정말 감사합니다. 좋은 공부가 되고 있는데 막히는 부분이 발생해서 질문드립니다.
화면은 Textarea 상태입니다.
Fiddler 확인한 결과 404 에러로 나오는데 해당폴더 밑에 DLL 파일이 존재합니다.
그런데도 안나오는군요.
2003서버를 사용하고 VS2005로 작업하였습니다.
DLL 인데도 Content-Type: text/html 로 나오네요. application/x-msdownload 이게 나와야된다던데.. 에러가 나서 이걸로 나오는건지.
해결방법이 있을까요?
#under76님 문제 해결 / 김지용 / 2009-04-01 오전 11:25:00
도움이 될까해서 적습니다. (수동추가하는법입니다.)
VS2008환경입니다. 2005는 테스트 못해봐서;;;
- 수동추가법 -
위에 순서대로 다해도 안뜨는데 이때 일단 도구상자에서 일단 탭하나 임의로 만드시고 그 탭에서 '항목추가' 누르셔서 찾아보기 하신후 under76님이 만드셨던 control의 dll파일을(ClientModule.dll) 수동으로 추가해주시면 도구상자 항목에 나타납니다.
그래도 안나오면 글 남겨주세요;;;
#smartclient에서 TcpClient는 사용할수 없나요? / audsud / 2009-09-15 오후 3:15:00
다운로드까지는 잘되는데 TcpClient를 이용하여 Tcp서버에 접속하려고 하면 계속 에러가 발생을 하네요...
"Inetrnet Explorer에 문제가 발생했기 때문에 프로그램을 종료해야 합니다. 불편을 끼쳐드려 죄송합니다." 이러한 메세지가 나타나네요...
혹시 알고 계신 문제면 답변좀 부탁드립니다...
#re: 스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 / 안재덕 / 2009-12-14 오전 10:59:00
안녕하세요...
스마트 클라이언트를 막 시작하는 초급개발자 입니다.

다름이 아니라 위의 내용을 보고 따라하고 있는데, 안되는 부분이 있어서요
첫번째 결과 단계에서 textarea 형태로 나오는 것 입니다.

fiddler로 돌려본 결과
# Result Protocol Host URL Body Caching Content-Type Process Comments Custom
34 304 HTTP localhost.com /SmartClientBasic/SmartClient.htm 0 iexplore:1896
35 500 HTTP localhost.com /SmartClientBasic/ClientModule.dll 103 text/html iexplore:1896

이렇게 나오고 있습니다... 35번 result 500에선 빨간 느낌표 에러모양 떠있고요...

Inspectors의 Raw 내용 입니다
GET /SmartClientBasic/ClientModule.dll HTTP/1.1
Accept: */*
Referer: http://localhost.com/SmartClientBasic/SmartClient.htm
Accept-Language: ko
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2)
Accept-Encoding: gzip, deflate
Range: bytes=8192-
Unless-Modified-Since: Fri, 11 Dec 2009 08:15:43 GMT
If-Range: "b19838223a7aca1:24e3"
Connection: Keep-Alive
Host: localhost.com

해결방법이 있을까요??