select into는 대상이 존재하지 않을 경우

insert into select는 대상이 존재할 경우

둘다 원본은 존재해야 함

'SQL' 카테고리의 다른 글

엑세스에서 Replace  (0) 2011.10.04
Like 연산자의 패턴에 쿼리 사용하기  (0) 2011.09.20

cpu 정품 쿨러에는 히트 싱크(cpu 열을 전달하기 위한 쇠 부분)와 팬부분이 서로 걸쇠로 연결되어 쉽게 분리된다

따라서 청소시에도 히트싱크와 팬은 걸쇠만 풀어주면 쉽게 분리하여 청소를 할수 있다.

 

그러나

CPU 쿨러를 청소하며 오래 사용하시려고 한다면

사제 쿨러중에서

아래 이미지 모양처럼 생긴 쿨러중

메인보드와 CPU 쿨러가 연결부분이 생긴 모양이 아래처럼 생기

 

 CPU 쿨러는 권하고 싶지 않다.

이유는 히트싱크와 팬 부분을 가정에서는 분리하기가 쉽지 않다

하단부에 원형의 고정링을 제거해야 하는대 이것이 쉽지가 않다

 제거 한다손 치더라도 다시 히트싱크와 팬을 조립할때 링을 끼워줘야 하는대

이것도 쉽지가 않다

일회용으로 사용신다면 적극 추천한다. 우선 가격이 저렴하기 때문이다.

'윈도우' 카테고리의 다른 글

프로세스  (0) 2013.07.01
ie8에서 탭창에 즐겨찾기 모음 같은 줄에 포함되었을때..  (0) 2012.09.27
메니페스트(*.manifest) 파일  (0) 2012.08.13
MIME  (0) 2012.07.31
소켓으로 웹 접속,요구,응답, HTTP 헤더  (0) 2012.07.31

manifest 파일은 실행파일명.manifest로 파일명이 되어있다.

예를들면 실행 파일명이 a.exe라면 메니페스트 파일명은

a.exe.manifest이다.

 

manifest 파일은 XML 파일이다.

manifest 파일은 윈도우 XP 이상에서

실행파일의 정보, 로드해야 하는 dll의 버전 정보, 실팽파일의 권한 등을

XML 문서 형식으로 저장된 텍스트 파일이다.

manifest 파일의 예이다.

manifest 파일의 XML 태그들에 대한 정보를 참조할만한 링크이다.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa375632(v=vs.85).aspx

c에서는 malloc와 free 함수를 사용하여 메모리 힙에 저장역영을 할당,해제 할수 있다.

malloc에 할당할 크기의 바이트수를 지정하면 힙에 할당할수 있으며

void *형을 반환하므로 변수에 저장시 해당 변수형으로의 캐스팅이 필요하다.

 

c++에서는 new와 delete 연산자를 사용하여 합에 저장영영역을 할당 해제 할수 있다.

int *a = new int

인트형 크기를 힙에 할당하며, a가 가리킨다.

해제는

delete a

배열은

int *a= new int[배열 요소 크기]

해제는

delete []a

'C,C++' 카테고리의 다른 글

friend 한정자는  (0) 2012.09.08
this 포인터란  (0) 2012.09.07
C++에서 레퍼런스  (0) 2012.08.05
메모리  (0) 2012.07.31
const 키워드  (0) 2012.07.31

 

사과나 복숭아 등 과일의 껍질을 벗기고 얼마 동안 놔두면 표면이 붉은 갈색으로 변하죠. 과일을 갈아 주스를 만들어도 붉은 갈색을 띠게 되요. 왜 이런 현상이 일어나는 걸까요?

 
이는 과일 속에 색깔을 변화시키는 물질인 ‘퀴닌산’이 들어있기 때문. 퀴닌산은 과일의 세포 속에 들어 있을 때에는 변화를 일으키지 않아요. 하지만 과일의 껍질을 벗기거나 자를 경우 세포의 일부가 파괴되면서 퀴닌산이 공기 중에 노출돼요. 이때 퀴닌산이 과일 세포에 들어 있는 산화 효소의 작용을 받아 공기 중의 산소와 결합해 산화작용을 일으켜 과일의 표면 색깔이 갈색으로 변하는 것. 만일 껍질을 벗긴 사과 등에 소금과 같은 염화나트륨 성분을 묻히면 산화 효소의 작용이 억제돼 색깔이 변하지 않아요. 레몬주스나 식초, 비타민C가 녹은 물 등을 뿌려도 색깔은 변하지 않죠. 레몬주스에 있는 구연산, 식초에 있는 초산, 비타민C(아스코르브산) 등의 산이 사과 표면의 산성도를 높여 산화를 촉진시키려는 효소의 힘을 앞서 빼앗기 때문예요. 그렇다면 과일을 찬 곳에 보관하면 맛있게 느껴지는 이유는 뭘까요. 과일의 단맛은 포도당과 과당에 의한 것. 이들은 온도가 낮을수록 단맛이 강하게 나요. 한 실험에 따르면 과일의 온도가 섭씨 5℃일 때는 30℃일 때보다 당도가 20% 정도 올라간다고 해요. 반면 신맛은 온도가 낮을수록 약하게 느껴진답니다.

C에서는 변수에 하나의 이름만 할당할수 있다.

int a=10;

이런식으로 밖에 할당할수 었다.

 

그러나 C++에는 변수에 다른 이름을 할당할수 있다.

그 역할을 하는 것이 레퍼런스이다.

int a=10;

int &b=a;

하게 되면

a라는 변수값이 저장된 영역에는 a 말고 b라는 이름이 또 할당된다.

포인터는 메모리를 할당 받지만 b는 메모리를 할당 받지 않는다.

 

선언시에 반드시 초기화되어야 한다.(인수로 사용시 선언 부분에서는 제외)

상수값을 초기화로 사용해서는 않된다.(int &a=10 이런식으로 사용할수 없다)

반드시 변수여야만 한다.

함수의 리턴값을 레퍼런의 초기화할 때도 마찬가지로 적용된다.

 

 

int a 변수 선언

int *a 포인터 변수 선언

int &a 레퍼런스 선언

 

함수의 인수로 레퍼런스를 사용하는 경우는

함수 영역 이외의 값을 변경시킬수 있으므로

Call By Reference로 간주한다.

 

함수의 지역변수를 레퍼런스로 반환하는 경우

호출자에서 이 지역변수를 참조하려 한다면

어떤 값l이 될지는 보장받을수 없다.

이유는 지역변수이기 때문에 호출 끝내는 사라지는

부분이므로 그 영역에 값은 어떤 값이 될지는 보장받을수는 없다.

'C,C++' 카테고리의 다른 글

this 포인터란  (0) 2012.09.07
힙에 메모리 할당.해제  (0) 2012.08.13
메모리  (0) 2012.07.31
const 키워드  (0) 2012.07.31
iostream과 iostream.h  (0) 2012.07.29

전역 변수와 Static 변수는 고정된 크기를 갇는다

 

컴파일시 크기를 알수 있는 영역은 스택에 할당된다.

 

컴파일시 크기를 알수 없고 런타임시에 크기가 결정되는 영역은 힙 영역에 할당된다.

 

스택과는 달리 힙에 할당되는 메모리는 프로그래머에 의해 관리되다.

 

malloc 함수는 힙에 메모리를 할당한다

free 함수는 힙에 할당된 메모리르 해제한다.

'C,C++' 카테고리의 다른 글

힙에 메모리 할당.해제  (0) 2012.08.13
C++에서 레퍼런스  (0) 2012.08.05
const 키워드  (0) 2012.07.31
iostream과 iostream.h  (0) 2012.07.29
c,c++,c#은  (0) 2012.07.29

변수를 상수화 시킨다.

즉 변수의 값을 바꾸지 못하게 한다.

 

일반적인 사용법이다.

const int a=10;

a의 값은 변경될수 없다. 포인터로도 변경할수 없다.

 

const int *n;

n이 가리키는 변수의 값을 *n=값 과 같은 형식에 의해서 변경이 불가능한 것을 나타낸다.

n이 가리키는 변수의 변수=값으로는 변경 가능하다.

이를 데이터 상수화라고 한다.

const int &n도 마찬가지 의미이다.(이런 형태는 포인터와 다른 레퍼런스라고 한다)

n이 가리키는 영역의 값을 n을 사용해서는 변경이 불가능하다.

 

int* const n;

전과는 달리 n이 가리키는 변수를 지정할수 없음을 나타낸다, n=&변수가 허용되지 않는다.

따라서 선언과 동시에 초기화 되어야 한다.

이를 포인터 상수라고 한다.

 

const int* const n;

이는 const int *n;과 int* const n;를 합해놓은 것이라고 보면 된다. 즉 n에 의해서는 값을 변경시킬수 없고 n에 새로운 대상을

지정할수도 없다.

 

인이셜라이즈=클래스의 멤버변수가 const로 선언되어있을때

일반 생성자에서 const 선언된 멤버 변수의 값을 할당하는 하는 코드가

지정되면 멤버변수가 const이기 때문에 에러가 발생한다.

이럴때 인이셜라이즈라는 예외적인 문법을 사용하면 const로 생성된

멤버 변수를 초기화 할수 있다.

클래스 내에 const int a 라는 멤버 변수가 있다고 할때

생성자

클래스명(int in) {

 a=in;

} 하게 되면 a가 const로 선언되기 때문에 컴파일시 에러가 발생한다.

이럴때 인이셜라이즈를 사용한다

 

const를 사용수가 많아지면 많아질수록 그 프로그램 더 안정적이다 라고 할수 있다.

클래스명(int in):a(in) {

}

생성자 정의의 a(in)이 인이셜라이즈이다. 이는 a=in을 하라는 소리이다.

이 구분읜 클래스가 메모리 할당후 생성자가 본문 순으로 처리되는대

인이셜라이즈는 메모리 할당, 인이셜라이즈 처리,생성자 본문 순으로 처리되나.

 

클래스에서 멤버 함수를 const화 하면

그 멤버 함수 내에서는 멤버 변수가 const로 선언되어 있지 않았더라고

멤버 변수의 수정은 불가능하다 단지 참조만 가능하다

반환값 함수명() const

와 같이 사용한다.

또한 멤버 함수를 const화 시키면 컴파일 타임에 멤버 변수를 조작할수 있는 가능성이

조금 이라도 있다면 이때도 에러를 발생시킨다.

(이는 해당 const 멤버 함수 내에서 다른 함수 호출시 그 함수가 const 함수인지만 판별한다.

본문 내용이 어떤지는 판별하지 않는다)

 

const int* test()

이 의미는 리턴되는 포인터를 사용한 포인터의 대상의 값은 변경불가이다.

 

const 객체

const 클래스명 객체명;

과 같이 사용하며

이와 같은 개체는

멤버변수가 const로 선언된 것과 같으며

따라서, 멤버변수의 값은 변경 불가능하다.

객체로서 호출할수 있는 함수는

const화 된 멤버 함수만 호출할수 있다.

일반 publi 멤버 함수는 호출 불가하다.

 

함수 오버로딩시에

함수,변수가 Const로 선언되었는지 않되었는지도 포함된다.

'C,C++' 카테고리의 다른 글

힙에 메모리 할당.해제  (0) 2012.08.13
C++에서 레퍼런스  (0) 2012.08.05
메모리  (0) 2012.07.31
iostream과 iostream.h  (0) 2012.07.29
c,c++,c#은  (0) 2012.07.29

 

MIME 

 설명

확장자 
 text/html  HTML file  html,html
 application/octet-stream  Uninterpreted binary

 바이너리 파일

     
     
     
     
     
     
     

소켓으로 웹에 접속하기 위해서는

사이트명을 사용해서 웹에 접속한다.

예)Winsock.SendData www.yahoo.co.kr

 

접속이 끝나면 요구 헤더를 보낸다.

여기서 헤더란 개행 문자로 구분되는 문자들을 말한다.

헤더와 데이터의 구분은 연속되는 2개의 개행문자로 구분된다.

대부분 하나의 문자열들은

:으로 구분된다.

예) Accept: *.*, */*

와 같이 : 왼쪽은 문자열이 나타내는 값명

: 오른쪽은 값이다.

 

값명들은 다음과 같다.

● 메소드 : 어떤것을 웹서버에 요청할지, 웹서버에서 응답온 것이 무엇인지를 나타낸다.

-GET : 지정된 리소스(URI)를 요청  예)GET 경로명 HTTP /1.1
-POST : 서버가 클라이언트의 폼 입력 필드 데이터의 수락을 요청. 클라이언트는 서버로 HTTP Body 에 Data 를 전송한다 
-HAED : 문서의 헤더 정보만 요청. 응답데이터(body) 를 받지 않는다 
-PUT : 클라이언트가 전송한 데이터를 지정한 uri 로 대체 한다(ftp 의 put 와 동일) 역시 클라이언트는 서버로 HTTP Body 에

          Data 를 전송한다 
-DELETE : 클라이언트가 지정한 URI 를 서버에서 삭제 
-TRACE : 클라이언트가 요청한 자원에 도달하기 까지의 경로를 기록하는 루프백(loop back) 검사용. 클라이언트가 요청 자원에

              도달하기 까지 거쳐가는 프록시나 게이트웨이의 중간 경로부터 최종 수신 서버까지의 경로를 알고자 할때 사용. 
● Accept : 클라이언트가 허용할 수 있는 파일 형식(MIME TYPE), */* 모든 파일형식을 다 지원하고자 할때

● User-Agent : 클라이언트 소프트웨어(브라우저,os등) 의 이름과 버전 등.

● Refer : 특정 페이지에서 링크를 클릭하여 요청을 하였을 경우, 링크를 제공한 페이지를 나타냄

● Content-Type : 요청한 파일의 MIME 타입, 예)Text/html는 데이타가 text 중 html 파일임을 말한다

● Content-Length : 헤더 이후 이어지는 데이터의 길이(바이트 단위)

'윈도우' 카테고리의 다른 글

메니페스트(*.manifest) 파일  (0) 2012.08.13
MIME  (0) 2012.07.31
비트맵(.bmp) 파일 구조  (0) 2011.12.16
화면보호기  (0) 2011.12.15
access 2007에서의 Replace 매크로 함수  (0) 2011.10.01

iostream.h 는 구버전 파일이며

iosteam은 신번전 헤더 파일이다

 

iosteam.h에서 cout는

cout<< 값<<endl; 이런 형식이다.

 

iostream에서 cout는

std::cout<<값<<std:endl; 이런 형식이다

 

오버로딩

같은 이름의 함수가 있고

이 함수에 전달되는 인수의 형식은 다를경우

C 같은 경우는 컴파일시 에러가 난다

왜! C에서는 함수를 찾을때 함수명만 가지고선 찾기 때문에

같은 이름의 함수가 두개 이므로  에러가 발생된다

그러나 C++은 함수를 찾을때

C와는 달리 함수명과 전달되는 인수 형식까지도 구분한다.

따라서 C++에서 컴파일하게 되면 에러가 발생되지 않는다

이처럼 함수명은 같고 전달되는 인수형식이 다른것을

오버로딩이라고 하며,

오버로딩에도 여러 가지가 있다.

여기선 함수를 사용했으므로

함수 오버로딩이라고 한다.

 

인라인함수

inline가 붙은 함수를 말한다.

이는 매크로 함수의 후속버전이라고 할가

그러나 차이가 있다.

매크로 함수는 전처리기에 의해 처리되지만

inline 함수는 컴파일러에 처리가 된다.

 

이름공간

함수들이나 기타 변수들을 묶어서 이름을 지정한하는 것을 말한다

NameSpace라는 키워드를 쓴다

NameSpace { 함수,변수들}

NameSpace의 함수나  변수 호출시

::(범위 지정 연산자) 를 사용한다.

네임스페이스명::함수나 변수명

 

using

단어 뜻 그래도 무엇을 사용할지를 지정한다.

네임스페이스에 함수나 변수를 호출시에는

네임스페이스명::함수명 변수명 사용해야 한다.

그러나 using를 사용하면 네임스페이스명을 생략하면

어떤 것이라고 지정할수도 있다.

using namespace 네임스페이스명 와 같이 하면

네임스페이스명의 함수명이나 변수명을 :: 사용하지 않고 사용해도 된다.

using 네임스페이스명::함수명 변수명은

지정된 함수명,변수명은 네임스페이스명을 지정하지 않고 사용해도 된다.

 

전역 변수와 지역 변수가 같은 이름의 변수가 있을때

지역에서 전역 변수를 호출하려면 ::변수명 하면 전역 변수를

참조할 수 있다.

 

 

 

'C,C++' 카테고리의 다른 글

힙에 메모리 할당.해제  (0) 2012.08.13
C++에서 레퍼런스  (0) 2012.08.05
메모리  (0) 2012.07.31
const 키워드  (0) 2012.07.31
c,c++,c#은  (0) 2012.07.29

c,c++,c#을 간단하게 도표로 만들면 다음과 같다.

 

절치 지향형                                                                                  객체지향형

      C                                               C++                                            C#

 

c는 절차 지향형 언어이고

c#은 객체 지향형 언어다.

그러나

C++은 이 절차지향형과, 객체지향형 둘다를 포함한다.

 

C++은 C의 문법을 포함한다.

그러나 C를 잘한다고 해서 C++를 잘하는것은 아니다.

C++의 C만 적용했다면 절치지향형 쪽으로 작성되어

있는 것이다. 객체지향형은 쪽은 전혀 안되어 있다는 소리이다.

 

C++에서

확장자가 C이면 C의 문법이 적용된다.

확장자가 CPP이면 C++ 문법이 적용된다

 

 

'C,C++' 카테고리의 다른 글

힙에 메모리 할당.해제  (0) 2012.08.13
C++에서 레퍼런스  (0) 2012.08.05
메모리  (0) 2012.07.31
const 키워드  (0) 2012.07.31
iostream과 iostream.h  (0) 2012.07.29

대개 일반적으로 서버 - 클라이언트의 프로그램을 작성한다 이를 투티어(Two-tier) 응용프로그램이다.

이외에 다 계층 프로그램을 작성시

Business 티어에서 사용하는 방법 중의 하나가

.Net 리모팅이다.

이전에 웹 서비스도 마찬가지로 다계층 방식으로 응용 프로그램 작성시

Business 티어 에서 사용하는 한 방법일 뿐이다.

 

그럼 리모팅이 무엇인지 알아보자.

서로 다른 어플리케이션 간에 객체나 메소드에 접근하는 분산 객체 기술이다.

 

다은음 기본적인 동작을 흐름도로 표시했다.

 

 

-마샬링

a에서 b로 객체의 메소드 호출시

메소드 호출에 필요한 전달 인수와, 또는 반대로 결과값 등을 묶어서

전달하는 것을 마샬링이라한다.

-참조에 의한 마샬링은 두 응용프로그램이 같은 도메인 즉 같은 컴에

존재하는 경우

-값에 의한 마샬링 두 응용 프로그래이 서로 다른 도메인에 있는 경우

사용되며, 객체의 직력화가 필요하다.

 

포매터

두 응용프로그램 간에(도메인) 마샬링된 값이 전달될때

마샬링된 값은 메세지로 변환되어 전송이 되는대

이 메세지로 변환하는 작업을 하는것이 포매터이다.

포매터에는 SOAP 포매터와 바이너리 포매터가 있다.

 

채널

위 포매터에 의해서 생서된 메세지가 전달되는 통로를

채널이라하면 HTTP 채널과 TCP 채널이 있다.

포매터를 지정하지 않으면

HTTP 채널에는 SOAP 포매터가 사용되며

TCP 채널에는 바이너리 포매터가 사용된다.

 

-프록시

-메시지 싱크(언마샬링)

-호스팅 어플리케이션

원격 객체는 객체이기 때문에 클라이언트의 요청을 받아 원격 객체의 소멸과 생성을 하는 대리인이

필요한대 이것을 해주는 것이 호스팅 어플리케이션이다.

여기서는 채널,포매터,원격 객체의 활성화 모드를 설정한다.

 

정리하면 리모팅은

서버 ----------- 호스팅 어플리케이션 ---------- 클라이언트라고 보면 된다.

나머지 내용들은 내부적으로 처리되는 내용들이다.

 

활성화란 원격 객체가 생성되어 원격 호출을 받을 준비가 된 상태를 말하며

여기에는 서버 활성화와 클라이언트 활성화가 있다.

서버 활성화에는 또다시 SingleCall과 SingleTon이 있다.

서버 활성화는 원격 객체의 생성과 소멸을 시점을 결정한다.

SingleCall은 같은 클래스 원격 호출이 이루어질때마다 객체가 따로 생성이된다.

즉, 클라이언트 메소드가 호출될 때마다 원격 개체가 생성이되며,

객체의 상태가. 유지 되지 않는다.

SingleTon은 같은 클래스 하나의 객체만 생성이되고, 원격 호출을 모두 이 객체가 처리한다.

즉, 서버에는 오로지 하나만의 객체가 생성이 되며 이 소멸은 서버가 저하며, 클라이언트가 얼마가 되었든

그것과 무관하게 서버의 하나의 클래스에는 하나의 개체만 생성이 된다. 따라서 각 클라이언트는 같은 객체를

공유하게 된다.

다음 이미지는 SingelTone과 SingeCall의 차이이다.

 

전자는 Singlecall이고 후자는 SingleTone이다.

 

클라이언트 활성화는 원격 객체의 활성화를 클라이언트가 결정한다,

즉 클라이언트에서 객체를 생성하면 바로 원격 객체하나가 생성되고,클라이언트에서 참조가 끝나면

바로 원격 객체가 소멸된다. CAO(Client Activeate Object) 모드라고 한다.

 

서버 활성화 방법

-원격 개체

원격 개체는 새 프로젝트에서 클래스 라이브러리(DLL) 선택하여 프로젝트를 생성한다.

원격 개체의 클래스는 System.MarshalByRefObject를 상속받아야만 한다.

 

- 호스팅 프로그램

참조에서 원격 개체 프로젝트를 추가한다.

System.Runtime.Remoting을 추가한다.

 

 

window Form 응용프로그램을 시작하고

웹서비스를 참조하게 되면

해당 프로젝트가 저장되는 폴더의

Web Reference 폴더 아래의 참조 Namesapce명의 폴더 아래

Reference.vb라는 파일이 있다.

 

이 파일에는 참조하는 웹서비스에 대하여 자동으로 생성된

추가적인 메소드들이 들어있다.

 

웹서비스 메소는 HelloWord였는대

추가적인 이벤트 HelloWorldCompleted

추가적인 메소드 HelloworldAsync,OnHelloWorldOperationCompleted

가 자동으로 생성되어있다.

 

HelloWord를 직접 호출하게 되면 동기 호출이 되고

결과가 반환될때까지 실행은 중지상태가 된다.

 

HelloWorldAsync를 호출하게 되면 비동기 호출이 되며

호출 뒤에 그 다음이 코드가 바로 실행이 되며

웹서버로 HelloWorld메소드에 호출에 대한 응답이 완료되면

HelloWorldOperationCompleted 이벤트가 발생된다.

 

 

또 다른 방법으로는

VB.Net에 자동으로 생성되는 코드로

Begin웹메소드명, End웹메소드명으로 생성되는 방식의 코드도 있다.

Begin으로 시작하는 메소드는 비동기 호출을 시작하는것이고

End로 시작하는 메소드는 비동기 호출 작업을 종료하는 것이다.

 

위 이미지와 같이 Begin,End로 시작하는 메소드가 자동으로 생성되는 방식이라면

비동기 대리자를 사용하여 처리하면 된다.

 

그러면 HelloWorld에 대한 비동기 호출을 지원하기 위한 VB.Net이 자동으로 생성한 코드로

BeginHelloWorld와 EndHelloWorld가 생성이 되있다고 가정하자.

또한 이런 방식의 코드에는

System 네이스페이스에

비동기 작업 종료시 메소드를 호출하기 위한 AsyncCallback 대리자와

웹메소드가 전달된 값고, 비동기 호출 작업 진행 상태를 알기 위한 IAsyncResult 인터페이스가 필요하다.

 

코드는 다음과 같다.

Dim Ws As New Test.Test

Dim Cb As New AsyncCallback(AddresOf EndWebService)

dim St As IAsyncResult

 

St = BeginHelloWorld(Cb,Ws)

 

Public Sub EndWebService(ByVal ar as IAsyncResult)

dim Ws As Test.Test

 

Ws=ar.AsyncState

MsgBox(Ws.EndHelloWorld(ar))

End Sub

 

우선 웹참조한 개체를 선언한다.

Dim Ws As New Test.Test

 

다음은 비동기로 호출할 작어에 대한 종료 메소드를 호출할 대리자를 선언한다.

Dim Cb As New AsyncCallback(AddresOf EndWebService)

비동기 호출 작업이 종료될때 호출할 메소드는 EndWebService이다.

AsyncCallback 대리자 호출할 메소드는 형식은

Public Sub 메소드명(ByVal ar as IAsyncResult)

ar은 비동기 호출 작업 상태를 얻을수 있다.

 

다음은 비동기 작업 상태를 확인하기 인터페이스 변수를 하나 선언한다.

dim St As IAsyncResult

 

이제 준비 단계는 끝났다.

 

비동기 호출을 해보자.

이전에 말했듯이

비동기 호출을 하기 위해서는 Begin으로 시작하는 메소드를 호출하면 된다.

St = BeginHelloWorld(Cb,Ws)

여기서 인수 마지막에서 두번째는 비동기 작업시 사용할 대리자를 지정하고

마지막에서 첫번째는 비동기 호출 메소드가 포함된 개체를 지정한다.

반환은 비동기 작업 상태를 확인할수 있는  IAsyncResult 인터페이스를 갖는 개체를 반환한다.

 

비동기 호출이 진행이 되었으니

웹 메소드의 작업이 완료되면

비동기 호출 대리자에 할당한 메소드가 호출이 된다.

 

그 대리자에서 넘어오는 인수 값도 역시

비동기 작업 상태를 확인할수 있는  IAsyncResult 인터페이스를 갖는 개체를 반환한다.

이 개체에서 AsyncState 속성을 참조하게 되면

비동기 호출 메소드가 포함된 개체를  얻을수 있다.

dim Ws As Test.Test

      Ws=ar.AsyncState

 

마지막으로 비동기 작업을 종료하는 메소드를 호출해주어야 한다.

Ws.EndHelloWorld(ar)

바로 End로 시작하는 메소드를 호출하면 된다.

인수로는 메소드에 전달된 비동기 작업 상태를 나타내는 개체를

지정하면 된다.

반환은 웹메소드 호출 결과를 반환한다.

MsgBox(Ws.EndHelloWorld(ar))

 

다음은 폼 로드 이벤트에 웹 메소드를 비동기,동기로 호출했을때의 차이이다.

 비동기 호출하게 되면 창이 보이고 메세지 박스도 같이 보인다.

 그러나 동기 호출하게 되면 메세지 박스가 우선 표시된 후에

확인 버튼을 누른 후에에 비로서 폼이 보인다.

먼저 기본 Form Widnow 응용프로그램을 시작한다.

솔루션 탐색기에서 솔루션명에서 오른쪽 버튼을 누른다.

다음과 같음 메뉴가 표시되면

 

웹 참조 추가 메뉴가 따로 없기 때문에 서비스 참조 추가를 선택한다.

그러면 다음과 같은 창이 뜨면

 

하단의 고급 버튼을 클릭하면 다음과 같은 창이 뜬다. 

 하단의 웹 참조 추가 버튼을 클릭하면 다음 이미지와 같은 창이 뜬다.

여기서 상단의 임지처럼 URL 옆의 텍스트 박스에 해당 웹서버/가상 디렉토리/asmx파일명을 지정한다.

정확한 경로라면 이미지 처럼 해당 웹서비스(클래스)에 대한 외부에 공개된 메소드가 표시된다.

오른쪽의 웹 참조 이름을 프로젝트에서 사용할 이름을 지정한다.

그리고 참조 추가를 선택한다.

 

다음 이미지는 솔루션 탐색기 웹참조가 추가된 상태의 이미지 이다.

 

Web Reference 아래 웹서비스가 추가된것이 보인다.

 

아래 이미지 처럼 아주 간단한 소스를 통하여 웹서비스에 접근할수 있다.

웸참조명.클래스명

 

 

여기서 웹 서비스 사용시에

노출된 메소드를 그냥 호출하게 되면 동기 상태로 호출된다.

즉 호출하는 시점에 프로세스는 일시 정지가 된다

웹 메소드의 실행이 끝날때까지 실행으 호출 시점에서 제어권은 웹 메소드로 넘어가며

웹 메소드의 실행이 종료가 웹 메소드에서 제어권을 바당 다시 하위 코드들이 실행된다.

 

따라서 작업이 오래 걸리는 웹 메소드라면 프로세스가 일시 중지된 상태처럼 보인다.

이를 개선하기 위한 비동기 호출로 웹섭스를 사용하는 방법을 알아보자.

웹서비스란

웹서버에서 구동되서 외부에서 접근가능한 네임스페이스를 갖고 메소드를 지원하는 서비스를 말한다.

 

Visual Studio 2010의 vb.net에서 웹 서비스를 만들어보자.

 

우선 웹서비스를 만들기 위해서는 웹서버가 필요하다.

iis를 설치한다.

제어판에서 윈도우 설치 관련 항목을 선택해

IIS를 선택하여 설치한다.

 

Visual Studio 2010의 vb.net을 시작한다.

 

파일 메뉴의 새 웹 사이트를 선택한다

 

메뉴를 선택하게 되면 다음과 같은 창이 뜬다

 

이 창에서 상단에 Net Framework를 선택하는 박스가 보이는대 이 박스에서

Net Framework 2.0.3.0 3.5 중 하나를 선택해야 웹 서비스 항목이 표시된다.

중앙에 ASP.Net 웹 서비스를 선택하고

 

하단의 URL 입력창에 웹서버의 디렉토리를 지정해 줄수 있다.

여기서 WebSite 대신에 다른 이름으로 지정하고 확인을 누르게 되면

웹 서버에 지정한 이름으로 가상 디렉토리가 생성이 된다.

 

이렇게 가상 디렉토리가 생성되는것이 싫으시면

찾아보기를 사용하여 웹서버의 디렉토리를 선택할수 도 있다.

 

확인 버튼을 누른다.

그러면 웹 서비스 기본 골격이 표시된다.

솔루션 탐색기는 다음과 같이 표시된다.

 

기본 코드는 Service.vb에 작성한다.

Service.vb에 기본 골격 내용은 다음과 같다.

 

Namespace에 할당할 이름과

외부에 노출할 메소드는 메소드 앞에 <WebMethod()> 특성을 지정하고, Public로 함으로서

왜부에 놓출할수 있다.

저장하고 컴파일한다. 오류가 없개

그리고 솔루션 파일은 문서 밑의 Visual Studio 10의 프로젝트 밑에 저장된다.

 

한가지 더

다음 이미지는 service.asmx의 내용이다.

 

끝에 Class의 할당된 문자열은 Service.vb에 포함된 클래스명과 동일해야 한다.

 

이로서 웹서비스는 준비가 되었다.

다음번에는 이 웹서비스를 사용항 윈도우 응용프로그램을 만드는 방법을 알아보자.

 

 

 

어셈블리(exe나 dll)은 전용 어셈블리와 공유 어셈블리로 나윈다.

전용 어셈블리는 하나의 응요프로그램에서 사용하기 위한 어셈블리이며

공유 어셈블리는 여러개의 응용 프로그램에서 사용할수 있도록 만들것을 공유 어셈블리라고 봄다.

 

아무 설정도 하지 않고 어셈블리를 만들개면 그 어셈블리는 전용 어셈블리이다.

 

공유 어셈블리는 전용 어셈블리와 같은 방식으로 만든 후에 3가지의 추가적인 처리가 필요하다.

 

또한 전용 어셈블리를 사용하는 경우는 사용하는 응용프로그램의 bin 디렉토리에 전용 어셈블리가 복사되나.

공유 어셈블리는 여러 응용프로그램이 사용해도 어셈블리 캐쉬에 1개만 존재한다.

 

1. 명령 프롬프트에서 sn 명령을 사용하여 공개키(*.key) 파일을 생성한다. 이 파일은 어셈블리명이 유일하도록 한다.

 

2. 개발 환경에서 AssembleInfo.vb 파일에서(언어마다 해당 응용프로그램의 어셈블리 정보를 포함하는 파일)

    1번에서 생성한 키 파일을 설정해 주어야 한다.

    속성 AssemblyKeyFile에 1번에서 생성한 파일의 경로를 지정한다.

    그리고선 우선 컴파일한다.

 

3. 생성된 파일을 어셈블리 캐쉬에 등록해야 한다. 이 위치는 윈도우 설치 폴더의 assembly 폴더이다.

   그냥 생성한 파일을 위 폴더에 복사하면 된다. 삭제도 단순히 파일을 삭제하면 된다.

 

첫번째 방법

debug 개체 사용

debug 개체는 다자인 타임에는 실행되지만

컴파일할때 이 이 제외된 상태에서 컴파일이 되기 때문에 이를 이용한다.

 

on error resume next

debug.print 1/0 ' 일부러 에러 발생시킨다

if err.number > 0 then msgbox "디자인 타임" else msgbox "런타임"on

on error goo 0

 

두번째 방법

API FindWindow를 사용

IDE 환경에서는 VB창이 떠있는것을 사용하여

If FindWindow("클래스명IDEOwner", vbNullString) > 0 Then msgbox "디자인타암" Else msgbox "런타임"

 

세번째 방법

API GetModuleHandle 사용

현재 프로세스에서 로드된 모듈을 확인한다.

Dim ModuleHandle As String Dim EnvFileName As String Dim EnvVal As Variant Dim ReturnVal As Long Dim i As Long EnvVal = _ Array("vb.exe", _ "vb32.exe", _ "vb5.exe", _ "vb6.exe") For i = LBound(EnvVal) To UBound(EnvVal) ModuleHandle = EnvVal(i) ReturnVal = GetModuleHandle(ModuleHandle) If ReturnVal <> 0 Then EnvFileName = ModuleHandle TestEnvironment = True Exit For End If Next if TestEnvironment then msgbox "디자인타임" else msgbox "런타임"

IDE 환경에서는 다중 파일 어셈블리를 만들수가 없다.

따라서 콘솔(명령 프로프트) 상에서 만들어야 한다.

콘솔 창은 다음과 같이 뛰운다. 

위 이미지와 같이 자신의 PC에 설치된 visual studio에 따라서

툴 메뉴의 명령 프롬프트 메뉴를 선택하면 콘솔창을 열수 있다.

 

다중 파일 모듈을 만들기 위해서는

모듈 파일이 필요한다.

이는 텍스트 파일에 코드를 적어주면 된다

namespace ~

    class ~

       코드

   end class

end namespace

이런 식으로 작성하고 확장자를 vb로 하여 저장한다.(a.vb라 칭한다)

 

이 파일을 컴파일하여 확장자가  netmodule로 된 파일을 얻어야 한다.

 

우선 콘솔 창을 연다.

코드가 vb.net 코드이므로

vbc를 사용한다.

vbc /t:module a.vb를 적어주면

a.netmodule라는 파일이 생긴다

이는 모듈 파일이다.

모듈 파일은 메니페스트가 존재하지 않는으므로 독자적으로 실행될수 었다.

메니페스트가 존재하는 파일에 포함이 되어야만 실행을 할수 있다.

 

그런 메니페스트가 있는 파일과, 생성한 모듈 파일을 포함해 보자.

 

이 파일도 마찬가지로 모듈 만들때와 같이 텍스트 파일로 작성한다.(b.vb라 칭한다)

 

모듈을 포함하는 컴파일은 다음과 같이 한다.

vbc /t:library /addmodule:a.netmodule /out:c b.vb

 

/t:library이기 때문에 dll 파일이 생성되므로 c.dll 이라는 파일(어셈블리)이 생성된다.

시작-해당 stuio 메뉴-툴-명령 프로프트 실행

ildasm

창이 하나 뜨면 파일 메뉴에 열기에서 자신의 결과물(exe,dll)을 선택하면

그 결과물에 대한 정보를 볼수있다

메니페스트,네임스페이스,메타 데이타,등의 정보를 확인할수 있다.

+ Recent posts