Event & Cast/Seminar(Event)2010. 6. 21. 12:36
패턴! 어떤 분에게는 이미 지나간 진부한 주제일 때이고, 어떤 분에게는 실용적이지 않다며 왜면하기 시작한 기술이 되어 버렸습니다. 수년간 데브피아를 통해 패턴 보급에 힘써왔던 저희 EVA가 더욱 성장해, 그 동안 들리지 못했던 미니 패턴 워크샾을 개발자 여러분을 위해 엽니다. 소프트웨어 패턴 저자가 되어 돌아온 EVA와 함께, GoF를 넘어 패턴의 새로운 관점을 얻어가시길 바랍니다.

* 프로그램 안내 & 사전 등록
 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=216&MAEULNO=8&no=1255&page=1

Posted by LenAWeb

댓글을 달아 주세요

  1. 사랑하는 자기. 오늘도 힘내, 파이팅

    2013.03.23 23:03 [ ADDR : EDIT/ DEL : REPLY ]
  2. 건강과 지성은 인생의 두가지 복이다.

    2013.03.24 14:09 [ ADDR : EDIT/ DEL : REPLY ]
  3. 젊을 때에 배움을 소홀히 하는 자는 과거를 상실하고 미래도 없다.

    2013.03.30 23:47 [ ADDR : EDIT/ DEL : REPLY ]
  4. 아름다운 여자가 해바라기하는 걸 좋아해요

    2013.04.02 03:17 [ ADDR : EDIT/ DEL : REPLY ]
  5. 아름다운 여자가 해바라기하는 걸 좋아해요

    2013.04.03 02:53 [ ADDR : EDIT/ DEL : REPLY ]
  6. 우리가 어디에 있는가가 중요한 것이 아니라 어디로 가야 하느냐가 중요한것이다

    2013.04.11 18:56 [ ADDR : EDIT/ DEL : REPLY ]
  7. http://www,Topics related articles:


    http://uistory.tistory.com/26 复件 (2) 韩

    .pandoraoutly.com/
    http://www,Topics related articles:


    http://koulkoul.tistory.com/112 复件 (10) 韩

    .suprashoesvl,Topics related articles:


    http://www.semstory.com/24 复件 (17) 韩

    .com/

    2013.04.21 16:08 [ ADDR : EDIT/ DEL : REPLY ]
  8. 희미한 달빛이 샘물 위에 떠있으면,나는 너를 생각한다.

    2013.04.24 15:18 [ ADDR : EDIT/ DEL : REPLY ]
  9. 사람들은 죽을걸 알면서도 살잖아 .사랑은 원래 유치한거에요

    2013.04.24 15:41 [ ADDR : EDIT/ DEL : REPLY ]
  10. 좋으면 좋고 싫으면 싫은 거지, 뭐가 이렇게 어렵고 복잡하냐구

    2013.07.13 01:22 [ ADDR : EDIT/ DEL : REPLY ]

 회차
 01. ConfigurationManager - Overview of ConfigurationManager Class

 02. ConfigurationManager - Practical use of ConnectionString to encrypt

02| ConnectionString 암호화 / 복호화
이전 회차에서 ConfigurationManager 클래스에 대해서 살펴보고 사용방법에 대해서 알게 되었습니다.
이번회차에서는 ConnectionString 문자열을 어떻게 관리할수 있을지 살펴보려고하는데요.
DB연결 문자열 부터 복잡한 설정 정보를 특별한 보안조치 없이 *.config에 설정을 하고 사용하게 된다면 다음과 같이 정보들은 그대로 노출하게 됩니다. 


그정보가 정말 중요한 정보라면 암호화 작업이 필요하지 않을까 싶습니다.

" 어? 암호화 배우지도 않았는데? 어떻게 구현하지? " , " 암호학은 배웠는데. 구현하기가 어려워!!! "
  다행이 구현에 어려움이 없이 System.Configuration 어셈블리의 제공으로 암호화/복호화를 쉽게 도와주는 메소드가 존재를 합니다.

SectionInformation 클래스에 대해서 소개를 하겠습니다.

SectionInformation 클래스
 - ProtectSection(암호화)
 - UnprotectSection(복호화)

우선 암호화 부터 먼저 살펴보도록 하겠습니다.

* ProtectSection(암호화 하기)
ProtectSection 메소드 별칭부터 섹션을 보호한다라는 의미를 가지고 있는데요. 별칭답게 섹션을 암호화하도록 표시하여 해당 섹션이 디스크에 함호된 형태로 기록을 하는 메소드입니다.

그럼 쉽다고 했는데. 형태가 어떻게 되나요?

public void ProtectSection (string protectionProvider)


메소드 형태를 살펴보니 단순한 형태였습니다.

이미 눈치 채신분들도 계시겠지만 매개변수 명칭이 무언가를 의미를 가지고 있어 보입니다.
그렇습니다. 이 파라미터의 쓰임은  사용할 보호 공급자의 이름을 지칭하는데요.

기본적으로 다음 보호 공급자로 포함하고 있습니다.
- DPAPIProtectedConfigurationProvider
- RSAProtectedConfigurationProvider

기본 제공 프로바이더를  차이점을 설명 해드릴려고 했는데. MSDN을 검색해보니  너무나 자세히 제공을 하고있네요.

* DpapiProtectedConfigurationProvider

Windows 기본 제공 암호화 서비스를 사용하며, 컴퓨터별 보호 기능이나 사용자 계정별 보호 기능을 사용하도록 구성될 수 있습니다. 컴퓨터별 보호 기능은 익명 서비스에 유용하지만 보안 수준이 낮습니다. 사용자 계정별 보호 기능은 특정 사용자 ID로 실행되는 서비스에서 사용할 수 있습니다.


 * RsaProtectedConfigurationProvider

클래스를 사용하면 구성 파일에 저장된 민감한 정보를 암호화할 수 있으므로 이러한 정보에 무단으로 액세스하지 못하도록 하는 데 도움이 됩니다.


그럼 본격적으로 구성파일을 암호화 해보도록 하겠습니다. 코드를 살펴보도록 하겠습니다.

[코드] 구성 파일 암호화 하기

Configuration config = 
                      
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

ConfigurationSection section = config.ConnectionStrings;

 

if (section != null)

{

      if (!section.SectionInformation.IsProtected && !section.ElementInformation.IsLocked)

{
            
section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");

            section.SectionInformation.ForceSave = true;

            config.Save(ConfigurationSaveMode.Full);

}

}


실제 암호화 하는 메소드는 다음과 같습니다.

section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");


코드 한번 간단하고 파워풀 하지 않나요?  그럼 결과는 어떻게 나왔을까요??

[결과] DataProtectionConfigurationProvider 기법으로 암호화


프로바이더를 변경해보도록 하겠습니다.
DataProtectionConfigurationProvider -> RsaProtectedConfigurationProvider
이제는  프로바이더 대신 으로 변경 해보도록 하겠습니다.

실제 암호화 하는 코드는 다음과 같습니다.
section.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider");


바꿔서 빌드를 하고 실행을 하였는데? 혹시 다음과 화면 나타나시는분 없으신가요?


" 왠 오류야?! 잘못 알려준거 아니야?  "

런타임 에러가 나타났다면 곧 컴퓨터가 포맷이 될것입니다.!!! 푸식.. ^___^

앗 농담이에요 =ㅁ=//

XP 사용자시라면 아무런 오류 없이 실행이 가능합니다만
실행 환경이 UAC(User Account Control)를 지원하는 Windows Vista 이상 이시라면 위와같이 에러가 발생하게 됩니다. 아무쪼록 권한 상승이 필요하기에 권한상승을 하도록 하겠습니다. 


Test 용도로 해당 프로젝트를 개발중이기 때문에 Visual Studio 2010 권한 상승을 하게 되었습니다.
여러분들은 그냥 실행 파일에 직접 권환 상승 하시거나 UAC를 권환 상승하도록 프로그램화 하여  배포 하시면 됩니다.

권한 상승이 이뤄졌다면 다시 RsaProtectedConfigurationProvider 제공자의 결과화면을 보도록 하겠습니다.

[결과] RsaProtectedConfigurationProvider 기법으로 암호화

방법을 이제 아셨으니 중요한 정보를 노출에 대해서 걱정 안하셔도 됩니다.
이렇게 암호화 하는 방법을 알았다면 이제는 복호화를 해야겠죠?

* UnprotectSection(복호화)
우선 메소드 형태부터 살펴보도록 하겠습니다.
public void UnprotectSection()

매개변수를 가지지 않은 구조로 가지고 있는데요.

복호화하기 위해 코드는 다음과 같습니다.

[코드] 구성 파일 복호화 하기

Configuration config = 
                      
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

ConfigurationSection section = config.ConnectionStrings;

 

if (section != null)

{

      if (section.SectionInformation.IsProtected)

{

           section.SectionInformation.UnprotectSection();

           section.SectionInformation.ForceDeclaration(true);

           section.SectionInformation.ForceSave = true;

           config.Save(ConfigurationSaveMode.Full)

}

}


연결된 구성 섹션이 보호되는지 여부를 판단하여 보호 되고 있으면 True를 반환할것이며 보호 되고 있지 않으면 false를 반환하게 됩니다. 

정상적으로 복호화가 되었는지 결과 하면을 보도록 하겠습니다.


정말 쉽게 암호화하고 복호화 하는 방법에 대해서 알아보았습니다.
이제 여러분들의 몫에 달렸네요 ^^

마지막으로 주의 하실점은 RsaProtectedConfigurationProvider를 사용하실때
RSA 암호화 방법은 보완 수준이 높지만 RSA 원리를 그대로 적용하기 때문에 만약 암호화된 구성파일을 복구화 하려고 할때 개인키를 가지고 있지 않으시면 복구 하실수 없으므로 주의가 필요합니다.

그외 보호되는 구성 섹션에 대한 자세한 내용은 아래 URL에서 구성 정보 암호화를 참조하십시오.
http://msdn.microsoft.com/ko-kr/library/53tyfkaw(v=VS.85).aspx


* 참고 문헌
- http://msdn.microsoft.com/ko-kr/library/ms134260(v=VS.85).aspx
- http://msdn.microsoft.com/ko-kr/library/system.configuration.sectioninformation_methods(v=VS.85).aspx

포스팅을 마치며...


이번 포스팅는 유익한 정보가 되셨는지 모르겠네요. ^^;;
무더위 준비 잘하시고 항상 좋은 하루 되세요 : )
감사합니다.

정은성 드림

Posted by LenAWeb

댓글을 달아 주세요

  1. 지송

    아 이런게 있군요.. 직접 암호화 시키려고 했었는데... ^^;; 잘보았습니다!

    2010.06.12 08:45 [ ADDR : EDIT/ DEL : REPLY ]
    • 감사합니다..^^ 필요하신 정보 있으시면 글써볼께요 ^^
      또 놀러오세요 : )

      2010.06.12 23:27 신고 [ ADDR : EDIT/ DEL ]
  2. 인생의 위대한 목표는 지식이 아니라 행동이다.

    2013.03.24 14:09 [ ADDR : EDIT/ DEL : REPLY ]
  3. 수면은 피로한 마음의 최상의 약이다.

    2013.03.28 00:09 [ ADDR : EDIT/ DEL : REPLY ]
  4. 행복을 졸겨야 할 시간은 지금이다. 행복을 즐겨야 할 장소는 여기다.

    2013.03.30 23:46 [ ADDR : EDIT/ DEL : REPLY ]
  5. 아름다운 여자가 해바라기하는 걸 좋아해요

    2013.04.01 19:50 [ ADDR : EDIT/ DEL : REPLY ]
  6. 아름다운 여자가 해바라기하는 걸 좋아해요

    2013.04.02 19:51 [ ADDR : EDIT/ DEL : REPLY ]
  7. 헤여졌다한들 슬퍼하지마. 이후에 만나게될 더좋은 사람을 위해 항상 웃는얼굴 잃지 말자.

    2013.04.03 19:57 [ ADDR : EDIT/ DEL : REPLY ]
  8. 지금은 반짝반짝 빛이 나겠지,, 하지만 시간이 흐르면 그빛은 사라저버릴거야,지금 우리처럼

    2013.04.24 22:28 [ ADDR : EDIT/ DEL : REPLY ]
  9. 다른 남자 부르면서 울거면 나한테 이쁘지나 말던지

    2013.04.25 20:57 [ ADDR : EDIT/ DEL : REPLY ]
  10. 희미한 달빛이 샘물 위에 떠있으면,나는 너를 생각한다.

    2013.07.13 08:22 [ ADDR : EDIT/ DEL : REPLY ]
  11. 좋으면 좋고 싫으면 싫은 거지, 뭐가 이렇게 어렵고 복잡하냐구

    2013.07.14 03:54 [ ADDR : EDIT/ DEL : REPLY ]

 회차
 01. ConfigurationManager - Overview of ConfigurationManager Class

 02. ConfigurationManager - Practical use of ConnectionString to encrypt

01| ConfigurationManager 소개
대부분의 어플리케이션들은 DB 연결 문자열부터 복잡한 설정 정보까지 여러 Configuration 정보를 필요로 합니다.  가끔 " 은성님은 Configuration 정보를 어떻게 관리 하시나요? " 라고 질문 하시는분이 계셔서 " Configuration 정보들은 어플리케이션의 요구사항에 따라 여러 방법으로 사용하고 있습니다 " 라고 답변을 드렸던 기억이 나네요. 그럼 일반적인 구성 정보들을 어떻게 관리를 할까요?

대부분의 개발자 분들은 다음과 같이 구성파일로 부터 어플리케이션을 개발 하지 않을까 생각이 듭니다.

Configuration 유형
 - xml files
 - windows ini files
 - database
 - code Embedded configuration
 - etc

위와 같은 방법으로 Configratuion 정보를 저장하며 관리를 하게 됩니다.
이번 포스팅을 통해 소개드릴 내용은 .NET 개발자라면 *.config라는 형식의 애플리케이션 구성 파일에 대해서 아시겠지만 .NET에 입문하시는 분 혹은 아직 모르시는 개발자분들을 위해 도움이 되고자 회차로 구성 해보았습니다.

아시는 개발자분들은 너무 서운해 하지 마세요^^ 그래서 팁에 대해서 소개드릴까 합니다.
3회차에 소개될
'  Practical use of ConnectionString to encrypt ' 포스팅의 주요 내용은
ConnectionString 정보를 암호화에 대해서 소개를 드릴 예정입니다.


머.. 뒷북이라면 당신은 대략 “지못미!!”

.NET에서는 *.config라는 형식의 애플리케이션 구성 파일(configuration file)을 둘 수 있다는 것은 대부분의 개발자분들이 알고 계시는 방법입니다. 예를 들어 애플리케이션이 winform1.exe이라는 화일명이라면 config 파일은 winform1.exe.config의 형태로 구성이 됩니다. ASP.NET 애플리케이션의 경우에는 예외적으로 web.config 라는 이름을 가지게 됩니다.

이러한 구성 정보를 관리를 하기 위한 이유는 Configuration 정보를 읽는 것 뿐만 아니라 쓰는 기능도 중요하게 고려해야 합니다. 만약 코드인 상태라면 그 설정 정보를 변경할때 재빌드를 해야한다는 단점이 있습니다.
설정파일과 프로그램 파일을 암호화 하지 않고 분리를 한다면 보안적 측면에서 위험하지 않을까요?

구성 정보는 읽기 읽고 쓰는 기능뿐만 아니라 보안 측면과 Integrity, 어플리케이션 성능에 대한 부분도 역시 고려되어야 합니다. 그러나 이러한 이슈에 너무 몰두하면 어플리케이션 개발 기능 자체가 늦어지거나 소홀 해지기 마련입니다.

runtime 1.x에서 지원이 되던 ConfigurationSettings클래스와 runtime 2.0이상 ConfigurationManager를 지원하는 두 클래스를 비교를 해보겠습니다.

우선 구성 파일 코드를 한번 보시죠^^

* [코드1-1] Runtime 1.x 구성파일 정보

<?xml version="1.0"?>
<configuration>
       <appSettings>
             <add key="Northwind" 
                     value="server=(local);database=northwind;Integrated Security=SSPI" />
         </appSettings>
         ...(중략)
</configuration>


* [코드1-2] Runtime 2.0 이상 구성 파일 정보

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
       <connectionStrings>
              <add name="Northwind"
                      connectionString="server=(local);database=northwind;Integrated Security=SSPI;" 
                      providerName="System.Data.SqlClient" />
       </connectionStrings>
</configuration>


코드 1-1의 경우 <appSettings>라는 섹션 내에 add 엘리먼트 타입으로 선언하게 되며 런타임 1.x 에서 사용값을 가져오기 위해서는 ConfigurationSettings.AppSettings나 AppSettingsReader 클래스를 사용 해야 했습니다.

* [코드2] Runtime 1.x 구성 정보 가져오기

string connectionString = ConfigurationSettings.AppSettings["Northwind"].Value;


DB만 읽는 문제라면 큰 문제점은 없었지만 여러 단점들이 존재를 하였습니다.

ConfigurationSettings와 ConfigurationManager클래스의 차이
 1. runtime 1.x에서는 코드[1-2]runtime2.0 구성처럼 관련된 속성들을 묶어서 처리하기 위해 section
    handler를 작성하고  <configSections/sectionGroup> 내부에 등록을 해야하는 번거로움
 2. runtime 1.x에서 configuration 파일에 대해 접근을 제공하는 클래스들은 모두 읽기 전용이였으며 
     config 파일의 내용을 프로그래밍적으로 변경을 할 수가 없어 당시 개발자분들은 XMLDocument에 관련
     된 클래스를 사용하여 직접적으로 xml을 처리하거나 register, ini 형태로 처리를 해야 했었습니다.
 3. WebForm인 ASP.NET과 WinForm인 윈도우 어플리케이션에서도 확연한 차이가 존재를 하였습니다.
     ASP.NET의 경우 configuration 내용이 변경이되면 구동되고 있는 프로젝트가 restart를 하게 되지만
     반면에 Winform의 경우 즉시 변경을 할수가 없었습니다. 2번 항목에서 소개드린것처럼 제공하는 클래스
     들은 모두 읽기 전용만 가능 했기 때문에 configuration 정보를 반영하기위해서 어플리케이션을 restart
     하기엔 번그러웠습니다. 이를 해결하기 위해서 file, register, database에 접근하여 새롭게 읽어 온다는
     건 성능 상 바람직하지 못합니다.
  

그렇다면 NET 2.0부터는 어떻게 달라 졌나요?
configuration 파일에 appSettings 및 connectionString과 같은 섹션을 추가하게 되었고 runtime1.0에서 사용던 ConfigurationSettings 클래스 대신 ConfigurationManager을 사용을 권장하고 있습니다.
ConfigurationManager도 또한 읽기 전용 작업으로 수행을 하고 구성의 캐시된 단일 인스턴스를 사용하며 다중 스레드를 인식합니다. 무엇보다 config 파일을 좀더 자유롭게 다루기 위해 ConfigurationManager 클래스가 탄생 하였고 하위 구성파일도 호환을 위해서 유지 됩니다.

ConfigurationManager의 특징
 1. AppSetting 및 ConnectionStrings 속성을 통해 <appSettings>,<connectionStrings>의 섹션을 바로
    접근을 할 수 있습니다. [아래 코드3 참조]
 2. 구성 파일의 섹션을 액세스 하기 위해서 GetSection() 메소드를 호출 합니다. 또한 다른 컴퓨터에 대한 
     모든 수준의 구성 설정을 로컬 또는 원격으로 읽고 쓸수 있으며 제공되는 메서드는 읽기 또는 쓰기 작업
     을 수행하고 파일이 쓰여질 때마다 구성 데이터를 만듭니다.
 3. 다양한 구성 작업을 지원합니다.(MSDN Library를 참조하세요)
     SectionInformation, PropertyInformation, PropertyInformationCollection, ElementInformation,
     ContextInformation, ConfigurationSectionGroup, ConfigurationSectionGroupCollection
 4. RefreshSection메소드(코드4 참조)를 사용하여 해당 섹션만을 파일에서 다시 읽어오도록 할 수
     있습니다. 뿐만 아니라 configuration 파일의 내용을 업데이트 할 수 있습니다.
     즉, configuration 정보들은 읽기 전용이므로 add 속성으로 쓰기를 할수가 없습니다.
     다만 (코드5 참조) 수정이 되는 요소들은 xxx.config 나 web.config가 아닌 machine.config이며 수정
     대상의 구분이 필요하지요. ConfigurationManager클래스에서는 machine.config을 수정할 수 있도
     록  OpenXXXXConfiguration(OpenExeConfiguration, OpenMachineConfiguration, 
     OpenMappedExeConfiguration, OpenMappedMachineConfiguration) 메소드들을 제공합니다.

* [코드3] Runtime 2.0 구성 정보 가져오기

* connectionStrings 세션의 경우
string connectionStr = ConfigurationManager.ConnectionString["Northwind"].ConnectionString
string connectionStr2 = ConfigurationManager.ConnectionString["Northwind"].ToString()

* appSettings 세션의 경우

string connectionStr3 = ConfigurationSettings.AppSettings["Northwind"].Value;


* [코드4] RefreshSection 메소드를 이용한 appSettings 세션의 다시 읽기

ConfigurationManager.RefreshSection("appSettings");


* [코드5] Config 정보 변경 및 RefreshSection를 이용한 세션 다시 읽기

using System.Configuration.Configuration;

string conStr = "server=(local);database=northwind;Integrated Security=SSPI;";
Configuration config = 
             ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
//ConnectionString Add
config.ConnectionStrings.ConnectionStrings.Add(new ConnectionStringSettings("conStr", conStr));
// Save the configuration file.
config.Save(ConfigurationSaveMode.Modified);
// Force a reload of the changed section.
ConfigurationManager.RefreshSection("connectionStrings");


위 코드는 .config 파일의 connectionStrings 섹션 내에 "conStr" 요소가 존재한다면 Connection String 값을 업데이터를 하게 되고 그렇지 않으면 새롭게 요소를 만들어 추가하게 되고 Save 메소드를 통해 변경 사항을 저장한뒤 RefreshSection을 호출을 하게 되어 connectionStrings 섹션에 한해서 변경된 내용을 새롭게 읽어 오게 됩니다.

포스팅을 마치며...


이번 포스팅는 ConfigurationManager 클래스 소개에 대해서 알아 보았습니다. ^^
너무 뒷북치는 내용과 지루 하지 않으셨는지 모르겠습니다ㅜ_ㅜ
좀더 유용한 예제로 소개 드려서 도움이 되었어야했는데.. 아쉽네요 ^^;  

아무쪼록 항상 즐거운 하루 되세요 ^^

정은성 드림


Posted by LenAWeb

댓글을 달아 주세요

  1. 가는 자는 쫓지 말지며, 오는 가는 막지 말라.

    2013.03.24 14:09 [ ADDR : EDIT/ DEL : REPLY ]
  2. 인생은 하나의 실험이다.실험이 많아질수록 당신은 더 좋은 사람이 된다.9 |

    2013.03.30 23:46 [ ADDR : EDIT/ DEL : REPLY ]
  3. a내가 당신이,Topics related articles:


    http://agnes71.tistory.com/archive/20120325 复件 (11) 韩

    , 짊어진 무거운 짐을,Topics related articles:


    http://duky.pe.kr/525 复件 (12) 韩

    , 사라지게 할순 없어도, 같이 나눠질수있는, 사람이 되고 싶습니다,Topics related articles:


    http://progh2.tistory.com/45 复件 (11) 韩

    .

    2013.04.07 02:46 [ ADDR : EDIT/ DEL : REPLY ]
  4. 다른 사람에서 다른 사람의 정신적 활동을 이해하고, 사물을 보는 개념은 자신의 미래에 대해 전혀 걱정할 필요가 없습니다.

    2013.04.08 02:47 [ ADDR : EDIT/ DEL : REPLY ]
  5. http://www,Topics related articles:


    http://prisonstory.tistory.com/19 复件 (2) 韩

    .adidazapatillasx,Topics related articles:


    http://tvpop.khan.kr/92 复件 (13) 韩

    .com/
    http://www.airmaxukse,Topics related articles:


    http://fkisocial.tistory.com/1430 复件 (10) 韩

    .com/

    2013.04.21 08:47 [ ADDR : EDIT/ DEL : REPLY ]
  6. http://www.pandoraoutly,Topics related articles:


    http://3hands.tistory.com/category/?page=2 复件 (18) 韩

    .com/
    http://www,Topics related articles:


    http://choikein.tistory.com/286 复件 (13) 韩

    .suprashoesvl,Topics related articles:


    http://seomin.khan.kr/183 复件 (13) 韩

    .com/

    2013.04.21 17:56 [ ADDR : EDIT/ DEL : REPLY ]
  7. 태양이 바다에 미광을 비추면,나는 너를 생각한다.

    2013.07.16 20:43 [ ADDR : EDIT/ DEL : REPLY ]

Expression Studio2010. 6. 8. 17:13


한국시간으로 6월 8일 Expression Studio 4 런칭이 있었습니다. 런칭과 동시에 Trial Version을 아래 사이트에서 제공을 하고 있네요. 이번에는 버전이 Ultimate와 Web Professional으로 구분되어 출시가 되었습니다.

Trial Version : http://www.microsoft.com/expression/try-it/

* Expression Studio Ultimate 버전
- Expression Web + SuperPreview
- Expression Blend
- SketchFlow
- Expression Encoder Pro
- Expression Design

* Expression Studio Web Professional 버전
-
Expression Web + SuperPreview
- Expression Encoder
- Expression Design

Trial Version은 60일동안 사용이 가능하며 기존에 블랜드를 사용하셨던 분은 Ultimate 버전을 사용하시면 됩니다.
사이트에 살펴보시면 릴리즈 노트도 같이 제공되어오니 참고하시고 새로운 기능을 활용해보시길바랍니다.

ReleaseNote : http://www.microsoft.com/expression/products/Blend_ReleaseNotes.aspx

그외 Studio에 관한 전체적인 업그레이드 내용을 보시려면
Microsoft® Expression® Studio Quick Start Guides을 참조하시길 바랍니다.
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=a01c8bed-69a1-4f0b-b439-2deac5d44a05&utm_source=feedburner&utm_medium=twitter&utm_campaign=Feed%3A+MicrosoftDownloadCenter+%28Microsoft+Download+Center%29#tm

Posted by LenAWeb

댓글을 달아 주세요

  1. 배우지 않으면 곧 늙고 쇠해진다.

    2013.03.24 14:09 [ ADDR : EDIT/ DEL : REPLY ]
  2. 건강은 제일의 재산이다.7

    2013.03.30 23:46 [ ADDR : EDIT/ DEL : REPLY ]
  3. 귀를 기울여봐 가슴이 뛰는 소리가 들리면 네가 사랑하는 그 사람 널 사랑하고 있는거야.

    2013.04.26 18:40 [ ADDR : EDIT/ DEL : REPLY ]
  4. 슬퍼서 우는거 아니야..바람이 불어서 그래..눈이 셔서..

    2013.04.27 21:46 [ ADDR : EDIT/ DEL : REPLY ]
  5. 희미한 달빛이 샘물 위에 떠있으면,나는 너를 생각한다.

    2013.04.28 09:17 [ ADDR : EDIT/ DEL : REPLY ]
  6. 당신은 내가사랑할 만한 사람이 아니예요,사랑하지 않으면 안될 사람이예요.

    2013.04.29 00:21 [ ADDR : EDIT/ DEL : REPLY ]
  7. 다른 남자 부르면서 울거면 나한테 이쁘지나 말던지

    2013.07.15 05:02 [ ADDR : EDIT/ DEL : REPLY ]

.NET Framework/C# Common2010. 5. 29. 03:56
 회차
 
01. Attributes - Overview of Attributes
 02. Attributes - Custom Attributes

02 | 사용자 정의형(Custom Attributes)
지난 작성된 글로부터 어트리뷰트란 무엇인지에 대해 알아보고 닷넷 프레임워크에서 미리 정의되어 있는 어트리뷰트에 대해서 살펴 보았습니다. 사용자 정의형 어트리뷰트에 대해서 정의와 사용법에 대해서 알아보도록 하겠습니다.

* Attributes Scope 정의
지난 아티클로 통해 Conditional Attribute에 대한 적용되는 요소에 대해서 설명을 하였습니다. 그렇다면 사용자가 직접 정의한 어트리뷰트 또한 적용 되지 않을까요? AttributeUsage를 이용한다면 작성한 어트리뷰트가 어떤 데이터형, 어떤 곳에 적용 시킬수 있을지 구체적으로 명시를 할 수 있습니다.

[System.AttributeUsage(AttributeTargets.Class)]
public class MyAttribute : Attribute
{
    //TODO
}

위 코드를 보시면 어트리뷰트를 클래스에 적용 하듯이 똑 같은 형태입니다.

이제부터 작성한 어트리뷰트는 적용시 AttributeUsage 어트리뷰트를 접미어를 선언하여 이용하시면 됩니다. 여기서 AttributeTargets.Class는 위치지정 파라미터가 됩니다. 만약 클래스가 아닌 다른 타입에 적용시 컴파일시 에러가 발생되니 유념하시길 바랍니다.
기본적으로 어트리뷰트는 System.Attribute클래스로부터 상속을 받아 정의합니다. 어트리뷰트도 하나의 클래스이므로 생성자나 멤버변수(필드), 메소드등을 가질수 있으며 상속도 가능합니다. 어트리뷰트 또한 일반적인 클래스처럼 생성자가 명시적으로 써주지 않아도 컴파일러에 의해 묵시적으로 디폴트 생성자를 가질 수 있습니다.

이 어트리뷰트의 용도는 해당 어트리뷰트를 사용할 수 있는 타겟(아래 표 참조)을 지정하고 어트리뷰트의 중복을 허용하거나 어트리뷰트에 대한 상속 허용 등을 지정할 때 사용합니다.

다음 System.AttributeTargets에 정의되어 있는 AttributeUsage안에 정의되어있는 파라미터들은 열거형 변수로 다음과 같습니다.

Member 어트리뷰트가 타겟 되어지는 곳
Class Class
Construct constructor
Delegate delegate
Enum enum
Event event
Field field
Sturct return value
Assembly struct
Property property
Parameter parameter
Method method
Interface interface
Module module
ClassMembers class, struct, enum, method, field, delegate, interface, constructor, property, event
All 모든 곳

* Attributes Class 정의(선언)
예)
[System.AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple=true)]
class MyAttribute : Attribute {
    private String firstName;
    private String lastName;

    public MyAttribute(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}

class My2Attribute : MyAttribute {
   private String middleName;
   public String MiddleName {
       get { return middleName; }
       set { middleName = value; }
   }
public My2Attribute() : base("defaultFirstName","defaultLastName") {}
}

위 예제에서는 어트리뷰트를 클래스와 메소드 레벨에서 사용할 수 있도록 지정하였으며 중복을 허용합니다. 그리고 상속을 지정하지 않는 경우 true 값이 설정됩니다.
위 예제처럼 여러 개의 데이터형에 라벨을 지정 하려면 ‘ | ‘ 파이프 연산자로 구분해주면 됩니다.
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor)]

모든 데이터형에 라벨을 붙이고 싶다면 AttributeTarget.All을 사용해주시면 됩니다.
[AttributeUsage(AttributeTargets.All)]

어트리뷰트 클래스 선언 방법은 보통 클래스 선언하는 것과 동일한 방법으로 선언하고 다만 System.Attribute로 부터 상속을 받으면 그 클래스가 어트리뷰트가 됩니다.
일반 클래스오 구별하귀 위해서 클래스 이름 접미사로 ‘Attribute’를 붙이는 것을 권장합니다. 부가적인 정보를 기록한다는 의미로 다음 예제와 같이 클래스 이름을 ‘MyInfoAttribute’ 어트리뷰트를 선언하여 사용 하겠습니다.

* 어트리뷰트 클래스 선언

[AttributeUsage(AttributeTargets.Class)]
public class MyInfoAttribute : Attribute
{
       private string _korName;
       private string _engName;
       private string _birthday;

       public MyInfoAttribute(string korName, string engName, string birthday)
       {
             this._korName = korName;
             this._engName = engName;
             this._birthday = birthday;
       }
       public string KorName 
       {
             get { return this._korName; }
       }
       public string EngName
       {
             get { return this._engName; }
             set { this._engName = value; }
       }
       public string Birthday 
       {
             get { return this._birthday; }
       } 


* 어트리뷰트 사용
[MyInfo("정은성", EngName = "Jeong Eun Seong", Birthday = "1984-12-02")]    class People { }

* 어트리뷰트 정보 얻기
class Test
{
       static void Main(string[] args) 
       {
               Type type = typeof(People);
                foreach (Attribute attri in type.GetCustomAttributes(true))
                {
                         MyInfoAttribute myInfo = attri as MyInfoAttribute;
                         if (null != myInfo)
                         {
                                 Console.WriteLine("한국 이름은 {0}, \n" +
                                                            "영문 이름은 {1}, \n" +
                                                            "생년 월일은 {2}",
                                  myInfo.KorName, myInfo.EngName, myInfo.Birthday);
                         }
                }
        }
}
* 결과
한국 이름은 정은성,
영문 이름은 Jeong Eun Seong,
생년 월일은 1984-12-02


위 예제 소스를 통해 어트리뷰트 클래스 선언과 사용에 대해 보셨습니다

코드를 통해 어트리뷰트 전체 이름(MyInfoAttribute)을 사용하셔도 되며 어트리뷰트 명에서 Attribute 접미사를 제외한 이름(MyInfo)만 사용해도 됩니다.여기서
주의사항은 어트리뷰트는 클래스 이므로 생성자를 가질수 있지만 반드시 생성자는 하나이어야만 합니다. 즉, 생성자를 오버로딩을 할 수 없습니다.

만약 추가적인 데이터를 집어 넣고 싶거나 변경하고 싶다면 일반 클래스에서는 생성자를 오버로딩해서 생성자를 하나 만들어 사용할 수 있었지만 어트리뷰트 클래스에서는 생성자를 꼭 하나의 가져야 하기 때문에 동일한 방법으로 할 수가 없습니다. 하지만 꼭 넣어야 할 데이터가 있다면 위치 지정 파리미터를 이용하여 추가적 데이터의 성격을 갖는 것을 명명 파리미터로 받아 이런 문제점을 해결합니다.

위 코드 중 class People { } 위에 다음과 같은 어트리뷰트를 보시면


([MyInfo("정은성", EngName = "Jeong Eun Seong", Birthday = "1984-12-02")])


클래스에 어트리뷰트를 타겟을 한 모습을 볼 수 있습니다.

근데 무언가 다르게 보이지 않나요?어떤 것은 인수만, 어떤것은 LValue에 RValue를 할당의 형태를 볼수 있습니다. 이들의 차이점를 분류 한다면 위치지정 파라미터와 명명 파리미터로 분류 할수 있습니다.

위치지정 파리미터는 생성자에 값을 그대로 전달하면 되지만 명명 파라미터는 파라미터 이름에 값을 대입해서 생성자에 넘겨야 합니다 
Tip>사용자가 정보(ex>영어표기법이 변동이 생길 경우)를 변경/추가이 있을경우 명명 파라미터를 이용

이렇게 선언 위치는 일반적으로 대부분의 어트리뷰트는 타깃 타입의 바로 위에 선언하며 어트리뷰트 식별 (Attribute Identifier)를 이용하여 어트리뷰트의 적용 대상을 명확히 할 수 있습니다.그 외 러턴값에 어트리뷰트를 적용하고 싶다면 메소드 위에 선언할 때에 [retrun:어트리뷰트]와 같이 선언하면 되며 어셈블리에 대한 어트리뷰트의 경우 AssemblyInfo파일에 [assembly:MyAttribute(“정은성”,”JeongEunSeong”)]와같이 선언 하면 됩니다.

People 클래스에 라벨을 붙여 타겟(사용)을 하였다면 People클래스로부터 어트리뷰트 정보를 가져오는 예제에 대해서 앞서 살펴 보셨습니다. 그렇다면 어떤 원리에 의해서 가져왔을까요? 살펴보도록 하겠습니다.


Type type = typeof(People);

어트리뷰트 정보를 얻기위해서 우선 People 클래스의 특성을 알아내기 위해서 typeof 연산자를 이용하여 Type 객체를 생성합니다.

type.GetCustomAttributes(true);

Tip> Type 클래스(System.Type)에 보시면 GetCustomAttributes(bool inherit) 메소드가 존재합니다. 이 메소드는 파생된 클래스로부터 멤버의 상속 체인 여부나 재정의되는 경우 특성을 포함하는 배열을 반환합니다. 즉, 클래스에 부착된 모든 어트리뷰트를 배열로 반환 합니다.

Attributes 컬렉션들은 배열로 반환하므로 반복 제어문에 의해서  배열의 개수 만큼 벨리데이션 체크를 하여 타겟 어트리뷰트가 존재하는지 비교검사를 해야합니다.

foreach (Attribute attri in type.GetCustomAttributes(true)) {
   //TODO :
}


Attributes 컬렉션을 Attribute 타입으로 담아왔지만 어떤 어트리뷰트들이 넘어올지 모릅니다.위  예제에서는 단 하나의 어트리뷰트에 대한 정보를 기술 했지만 2개 이상의 어트리뷰트를 정의 했더라면 해당 어트리뷰트에 대한 다운 캐스팅을 하여 처리해야 합니다.
Tip> 각각에 대한 캐스팅을 올바르지 하지 않는 다면 예외처리가 발생할수 있으므로 주의 하세요 ^^;

MyInfoAttribute myInfo = attri as MyInfoAttribute

위 코드와 as 연산자를 사용하여 해당 어트리뷰트가 아닐경우 null 처리하고 null 이 아니라면 원하는 필드의 특성에 대한 정보를 조회 하실수 있습니다.^^

* 사용자 정의 어트리뷰트의 처리과정
컴파일러가 구문 실행중 어트리뷰트를 파싱하기 까지 이것을 어떻게 처리 해야할지? 궁금하지 않으신가요?
사용자 정의 어트리뷰트의 처리 과정은 다음과 같은 과정을 거쳐서 결정하게 됩니다.


사용자 정의 어트리뷰트의 처리과정
  1. 어트리뷰트 클래스 찾는다.
  2. 어트리뷰트의 범위를 체크한다.
  3. 어트리뷰트의 생성자를 체크 한다.
  4. 객체의 인스턴스를 생성한다.
  5. 명명 파라미터들을 체크한다.
  6. 명명 파리미터 값으로 필드나 프로퍼티 값을 설정한다.
  7. 어트리뷰트 클래스의 현재 상태를 저장한다.

다음 코드를보며 처리과정에 숨겨진 사실?! 알려드리겠습니다.
[AttributeUsage(AttributeTargets.Class)]
public class MyInfoAttribute : Attribute
{
    //TODO :
}
[MyInfo("정은성", EngName = "Jeong Eun Seong", Birthday = "1984-12-02")]
class People { }

코드를 보시면 Pepele 클래스위에 존재하는 MyInfo 과 어트리뷰트 정의한 이름인 MyInfoAttribute이 있습니다. 2개의 이름이 다르며 왜 달라?! 라고 의심스러울수도 있습니다. 이는 컴파일러하고 실행 하여도 아무런 문제가 없습니다. 왜 그럴까요?

OOP기법으로 설계를 하면서 Attribute를 생략하여도 아무런 문제 없도록 고안하였습니다

구체적으로 살펴본다면 컴파일시 해당 어트리뷰트를 찾게 되고 존재하지 않는다면 Attribute접미사를 붙여서 해당 어트리뷰트를 찾게됩니다. 마치 생성자를 생성할 때 묵시적으로 생성하는 개념하고 비슷하지 않나요 ^^? 이해가 되셨으면 합니다.

즉, People 클래스가 컴파일 될 때 컴파일러는 MyInfo 클래스를 찾게 되고 만약 존재하지 않는다면 컴파일러는 MyInfoAttribute 클래스를 찾게 됩니다. 그 이후 어트리뷰트가 클래스에 타겟되는 것을 허용하는지 체크를 합니다.

체크가 끝나면 생성자에게 넘겨진 파리미터와 어트리뷰트에 정의한 파라미터들이 일치하는지 검사하고 생성자에 넘겨진 값들을 가지고 객체의 인스턴스를 생성합니다. 만일 파라미터중에 명명 파라미터가 있다면 컴파일러는 어트리뷰트에서 그 파라미터와 매치되는 필드나 프로퍼티를 설정해줍니다. 그후 어트리뷰트 클래스의 현재 상태는 프로그램 요소들에 적용되는 메타 데이터로 저장이 됩니다.


* Mutilple Attribute의 사용
타겟이 되는 요소에 한개이상의 어트리뷰트 라벨을 부여 할수 있습니다.
public class CS {  
      ...(생략)   
      [conditional(“CLR”)]   
      [LOVE(“I Love C sharp”)]   
      public void method() {  }
}

하지만 제가 예제로 보여드렸던 코드에서 다음과 같이 기술한다면 에러가 발생합니다.
[MyInfo("정은성", "Jeong Eun Seong","")]
[MyInfo("데브피아", "Devpia","")]
[MyInfo("마이크로소프트", "Microsoft","")]
class People { }

왜냐하면 AllowMultiple = true로 설정을 해두지 못하여 발생되었습니다

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class MyInfoAttribute : Attribute
{
     //TODO :
}

포스팅을 마치며...

이번 포스팅은 너무나 늦게 올려드린것 같아요. 새로운 블로그로 이사 하는 과정에서 문제가 발생하여 아직 공개를 할수가 없었습니다. ^^ 용서 해주실꺼죠 ^^?
항상 좋은 하루 되시길 기원합니다.
정은성 드림
Posted by LenAWeb

댓글을 달아 주세요

  1. 그런 다음 먼 길, 단계적으로는 발에 연결할 수 없습니다 데려 갈 수 없어, 다음 짧은 방법을 완료 할 수 있습니다.

    2013.03.24 03:15 [ ADDR : EDIT/ DEL : REPLY ]
  2. 사랑은 한순간에 불타오르는 열정보다는 상대방을 말없이 따뜻하게 해주는 은은한 등불이다.

    2013.04.11 00:11 [ ADDR : EDIT/ DEL : REPLY ]
  3. 사람들은 죽을걸 알면서도 살잖아

    2013.04.23 21:43 [ ADDR : EDIT/ DEL : REPLY ]
  4. 지금은 반짝반짝 빛이 나겠지,, 하지만 시간이 흐르면 그빛은 사라저버릴거야,지금 우리처럼

    2013.04.29 00:43 [ ADDR : EDIT/ DEL : REPLY ]
  5. 태양이 바다에 미광을 비추면,나는 너를 생각한다.

    2013.07.18 07:06 [ ADDR : EDIT/ DEL : REPLY ]
  6. 몸에 좋은 남자

    매번 attribute 보면서 뭔지 몰랐는데 본 기사를 보니까 이해하겠네요 감사합니다^^

    2015.07.11 22:57 [ ADDR : EDIT/ DEL : REPLY ]
  7. 대체 Attribute가 뭐 하는 건지 이해 못 하고 있었는데 덕분에 어느정도 이해하게 되었습니다
    감사합니다 ㅠㅠ

    2016.03.23 23:32 신고 [ ADDR : EDIT/ DEL : REPLY ]

.NET Framework/C# Common2010. 5. 29. 03:56

 회차
 01. Attributes - Overview of Attributes
 
02. Attributes - Custom Attributes

01 | 개요(Overview of Attributes)
    어트리뷰트는 클래스 안에 메타정보를 포함 시킬 수 있는 새로운 기술입니다. 어트리뷰트는 선언적 컴파일을 지원하기 때문에 코딩에 많은 이점을 주고 있으며 특히 컴포넌트를 만들 때 유용하게 쓸 수 있습니다.

실제, 어트리뷰트는 클래스 멤버변수로 관리하기에는 적절하지 않고 주로 코드 외부에서 어떤 자료형에 대한 서술이 필요할 때 많이 사용하는 편입니다.

Attributes 소개
    어트리뷰트는 최근 자바 이노테이션(Annotation)의 등장으로 어트리뷰트 오리엔티드 프로그래밍(attribute oriented programming)에 대한 관심이 많아 지고 있습니다. 하지만 어트리뷰트 오리엔티드 프로그래밍은 마이크로소프트(이하 MS)진영에서 COM, COM+개발에서 부분적으로 이미 사용하고 있고 닷넷 프레임워크 경우 어트리뷰티드 프로그래밍이라는 이름으로 지원하고 있습니다.

어트리뷰트 오렌티드 프로그래밍이란 프로그램 레벨에서의 마킹 기법입니다.
이를 사용하면 프로그램을 개발할 때 프로그램과 관련된 메타데이터를 정보를 저장하고 이 정보를 이용하여 디자인&컴파일 타임 로딩 또는 런타임 시에 원하는 동작을 수행 하도록 할 수 있습니다.

예를 들면 트랜잭션(Transaction)이라는 어트리뷰트를 선언한 클래스는 클래스의 메소드를 실행할 때 트랜잭션 컨텍스트 내에서 수행 되도록 한다. 이러한 기법은 코어 비즈니스 로직과 트랜잭션과 로깅과 같은 횡단 관심사(Cross-cutting concerns)를 분리한다는 점에서 AOP(Aspect Oriented Programming) 기법과 유사합니다.

* 어트리뷰티드 프로그래밍 패러다임의 시작
    어트리뷰티드 프로그래밍 기법은 COM 기반 프로그래밍에서의 인터페이스 정의 언어(Interface Definition Language)에서 사용되기 시작했다. 라이브러리와 클래스의 uuid나 helpstring같은 프로그램에 대한 메타데이터 값들을 라이브러리나 클래스의 정의에 다음과 같이 선언해 컴파일 시에 참조할 수 있도록 지원 합니다.

[uuid(74731E6F-A0E8-47FB-833C-8D6C75E85981),
helpstring("
MessengerAx Control"), control]
coclass MessengerAx

이러한 기법은 COM+ 기반을 발전하면서 애플리케이션의 트랙젹선 설정과 풀리, 보안 설정 등의 메타데이터 정보를 구성요소 서비스와 같은 별도의 저장소를 이용해 등록한 후 이정보를 런타임시 참조를 해야 동작이 가능합니다.

하지만 이러한 기능을
닷넷 에서는 이보다 한 단계 더 발전된 형태로 어트리뷰트를 별도의 저장소가 아닌 프로그램 내에 직접 저장할 수 있고 동작이 가능 합니다.

어트리뷰트는 클래스 뿐만 아니라 데이터 구조, 열거자 그리고 어셈블리와 같은 프로그래밍적 요소들의 실행시 행동에 대한 정보를 기술 할수 있습니다. 어트리뷰트를 아티클을 보시는 여러분들은 코드에 대해서 어떻게 지정되고 사용되는지에 대한 주석으로 생각 할수도 있습니다. 하지만 일반 주석의 의해 전달되는 정보들은 일정한 틀이 없고 그것을 정형화하기 힘듭니다. 또한 그 정보들에 대해 런타임상의 접근하기가 어렵습니다.


어트리뷰트는 메타데이터지만 일종의 클래스입니다.
어트리뷰트를 정의해서 사용하게 되면 어떠한 클래스에 대해 설명할 때 이 어트리뷰트를 사용해서 설명할수 있고 주석처럼 직접 소스를 보아야 알수 있는 정보들을 어셈블리 안에 직접 넣거나 그 정보을 보는 방법도 코드레벨에서 가능합니다. 즉, 어트리뷰트는 작성한 클래스와 어떤 정보들(ex>이 클래스는 누가 디자인했고 라이센스는 누구한테 있으며 버전은 몇버전이다) 을 연결시켜주는 기술을 지원합니다.

* 어트리뷰트 사용
어트리뷰트를 사용할 수 있는 요소는 다음과 같습니다.
어트리뷰트를 사용할 수 있는 요소들
 어셈블리, 모듈, 클래스, 구조체, 열거형, 변수, 생성자, 메소드, 프로퍼티, 필드, 이벤트, 인터페이스, 파라미터,
 반환값, 델리게이트


* 어트리뷰트 문장 형식
attribute(positional_parameters, name_parameter = value, ...)]

'[ ]' 안에 무슨 메소드와 같은 것이 쓰여져 있습니다. 그리고 그 메소드 안에 파라미터들이 있습니다.

여기서 파리미터는 두가지를 의미합니다. 하나는 위치지정 파라미터(positional_parameter)로 꼭 필요한 정보들을 기술할때 쓰며 위치 지정 파라미터는 반드시 넣어줘야하는 정보들입니다. 두번째로는 명명 파라미터(name_parameter)는 꼭 필요하지 않지만 사용자에 따라서 넣을 수도 있고 그렇지 않을수도 있습니다. 어트리뷰트 안에 추가적인 정보를 집어 넣을때 사용됩니다.


* 어트리뷰트 사용 예
[AdditionalInfo("2009-05-20")]
public class Test
{
   //TODO :  내용
}
여기서 AdditionalInfo는 어트리뷰트 이며 "2009-05-20"는 위치지정 파리미터가 됩니다. 개발하고자하는 코드바로위에 어트리뷰트를 써주면 됩니다.

* 예약되어 있는 어트리뷰트
일반적인 어트리뷰트
어트리뷰트 적용 요소 설명
Conditional Method 지정된 심볼이 정의되어 있는지에 따라 함수를 실행할 것인지 아닌지를 결정한다.
Dlllmport Method 명시된 Dll 파일 안의 Unmanaged 코드를 사용 할 수 있다



COM Interoperability 어트리뷰트
어트리뷰트 적용 요소 설명
ComRegisterFunction Assembly 닷넷 어셈블리를 COM이 사용할 수 있도록 레지스트에 등록할 때 호출되는 함수임을 나타낸다.
ComImport Class 클래스나 인터페이스의 정의가 COM 타입 라이브러리로부터 가져온 것을 나타낸다.
ComUnregisterFunction Assembly 닷넷 어셈블리를 레지스트리로부터 삭제할 때 호출 되는 함수임을 나타낸다.
InterfaceType Interface 관리된 인터페이스가 COM에 노출 되었을 때 그 인터페이스가 IDispatch인지 IUnknown인지 또는 dual인터페이스인지 나타낸다.
Displd Method,
Property
함수(메소드) 나 속성에 사용될 Dispatch ID를 나타낸다.
In Field,
Parameter
필드나 파라미터가 input값으로 사용됨을 나타냄
Out Field,
Parameter
해당 인자 값을 통해서 불려진 함수가 결과 값을 리턴할  때 마샬링을 해줘야 함을 나타낸다.
Progld Class 클래스를 사용하기 위한 Prog ID를 나타낸다.
MarshalAs Field,
Parameter
데이터가 COM과 관리(managed)되는 사이에서 어떻게 마샬링되는지 정보를 나타낸다.
HasDefaultInterface Class 클래스가 디폴트 COM 인터페이스를 가지고 있음을 명시적으로 나타낸다.


Visual Designer Component-Building 어트리뷰트
어트리뷰트 적용 요소 설명
Browseable Property,
event
프로퍼티나 이벤트가 비주얼 디자이너의 프로퍼티 창에 나타나야하는지 명시
DefaultEvent Class 컴포넌트를 위한 디폴트 이벤트를 명시한다.
Persistable Property 프로퍼티 저장되어야 하는지, 저장되어야 한다면 어떻게 저장 되어야하는지 명시
Category Property,
Event
프로퍼티 창에서 프로퍼티나 이벤트가 어느 카테고리에 들어가야 하는지 명시
Description Property,
Event
프로퍼티나 이벤트가 선택 됐을 때 프로퍼티 창 밑에 나오는지 설명을 정의
Localizable Property 프로퍼티가 폼이 지역화되었을 때 리소스 파일에 저장되어야함을 명시
Persistable Property 프로퍼티가 저장되어야 하는지, 저장되어야 한다면 어떻게 저장되어야 하는지 명시
DefaultProperty Class 컴포넌트를 위한 디폴트 프로퍼티를 명시
DefaultValue Property 컴포넌트를 위한 기본 값이 프로퍼티임 명시
Bindable Property 컴포넌트를 쓰고 있는 클라이언트들에게 프로퍼티가 변경되었음을 알려주어야 함을 명시


Transaction Handling 어트리뷰트
어트리뷰트 적용 요소 설명
Transaction Class 컴포넌트가 트랜잭션을 지원하거나 트랜잭션이 필요한지 새로운 트랜잭션의 환경에서 불려져야 하는지 혹은 무시 되거나 지원이 안되는 것은 아닌지 명시한다.


* Conditional 어트리뷰트 사용
#define DEBUG       //DEBUG   
//어트리뷰트 사용  
// #undef DEBUG     //어튜리뷰트 사용 해제
using System;  
using System.Diagnostics;
namespace CSharpStudy  
{  
       class  MainClass  
       {  
           [Conditional("DEBUG")]  
           public static void DebugPrint()  
           {  
              Console.WriteLine("Debug");  
           }   

           [STAThread]  
           static void Main(string[] args)  
           {  
              DebugPrint();  
           }
       }
}


C#코드는 디버깅을 지원하기 위해서 Conditonal 어트리뷰트를 사용 하며 지원을 합니다. Conditional 어트리뷰트는 사용자가 정의한 값에 의존해서 해당 메소드를 실행 시키도록 합니다. Conditional 어트리뷰트는 System.Diagnositcs 네임스페이스 안에 정의 되어 있습니다.

즉, #define을 설정해주지 않으면 실행 되지 않으며 설정시 실행이 됩니다.
Conditional 어트리뷰트는 클래스나 구조체 안에 있는 메소드에만 접착시킬 수 있다. 또한 그 메소드는 반드시 void형이어야 하며, 여러 Conditional어트리뷰트를 접착시키면 그중 하나만 위치지정 파라미터가 정의 되어 있어도 해당 메소드는 실행됩니다.

[conditional("MODEM"), Conditional("ADSL")]  
static void print()  
{  
     Console.WritleLine("인터넷을 사용할 수 있습니다");  
}

* DllImport 어트리뷰트
   DllImport 어트리뷰트는 C#안에서 Unmanaged 코드를 사용 할 수 있게 합니다. Unmanaged 코드란 닷넷 환경밖에서 개발된 코드를 말하며 예를들면 DLL 파일들안에 컴파일된 표준 , DllImport 어트리뷰트는 System.Runtime.InteropServices 네임스페이스안에서 정의 되어있습니다.

using System  
using System.Runtime.InteopServices;  
class testClass  
{  
        [DllImport("User32.dll"]  
        public static extern int MessageBox(int h, string m, string c, int type);   

        static void Main()   
        {  
             MessageBox(0, "Hello world!", "C#", 0);  
        }  
}

다음은 Win32 API중 User32.dll안에 있는 MessageBox함수를 호출형태 입니다.

int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);  

     [DllImport("kernel32.dll")]  
     private static extern bool Beep(int freq, int dur);   
     [STAThread]  
     static void Main(string[] args)  
     {  
          MessageBox(0, "MessageBox Text", "DllImport Test", 2);  
          Beep(2600,1000);  
     }

위코드는 외부의 비관리(Unmanaged)코드에 있는 DLL을 특정 프로세스 메모리에 로딩하여 해당 메소드를 호출하여 사용한 예입니다.

※ extern 키워드 : 어떤 메서드가 현재 프로그램 외부에 있음을 나타내는 키워드

포스팅을 마치며...

긴 포스팅 읽어주셔서 감사드리며 다음 포스팅에서는 사용자 정의형 어트리뷰트에 대해 살펴보도록하겠습니다.
항상 좋은 하루 되시길 기원합니다.
정은성 드림
Posted by LenAWeb

댓글을 달아 주세요

  1. 그런 다음 먼 길, 단계적으로는 발에 연결할 수 없습니다 데려 갈 수 없어, 다음 짧은 방법을 완료 할 수 있습니다.

    2013.03.24 03:15 [ ADDR : EDIT/ DEL : REPLY ]
  2. 우리에게 가장 쓸모없는 날은 웃지 않는 날이다.

    2013.04.07 22:32 [ ADDR : EDIT/ DEL : REPLY ]
  3. 당신은 내가 만나는 가장 아름다운 풍경입니다.

    2013.04.08 05:15 [ ADDR : EDIT/ DEL : REPLY ]
  4. 그런 다음 먼 길, 단계적으로는 발에 연결할 수 없습니다 데려 갈 수 없어, 다음 짧은 방법을 완료 할 수 있습니다.

    2013.04.08 21:19 [ ADDR : EDIT/ DEL : REPLY ]
  5. 세계는 절대적으로 공정하고 공평 하나의 요점은 그게 아니 잖아.

    2013.04.09 18:51 [ ADDR : EDIT/ DEL : REPLY ]
  6. 지금은 반짝반짝 빛이 나겠지,, 하지만 시간이 흐르면 그빛은 사라저버릴거야,지금 우리처럼

    2013.04.23 18:01 [ ADDR : EDIT/ DEL : REPLY ]
  7. 슬퍼서 우는거 아니야..바람이 불어서 그래..눈이 셔서..

    2013.07.11 17:08 [ ADDR : EDIT/ DEL : REPLY ]

Event & Cast/Seminar(Event)2010. 5. 24. 14:59
* 사전 등록 : http://amail.devpia.com/Check.html?TV9JRD1maW5tYXN0ZXI=&U1RZUEU9TUFTUw==&TElTVF9UQUJMRT1FQkFEMDU2MA==&UE9TVF9JRD0yMDEwMDUyNDAwMDAx&VEM9MjAxMDA2MDc=&S0lORD1D&Q0lEPTAwNQ==&URL=http://www.gsion.kr/gkoc.aspx?cn=111



Posted by LenAWeb

댓글을 달아 주세요

  1. 나는 최근 블로그를 통해 와서 함께 책을 읽은 적이있다. 내가 처음으로 덧글을 남길 것이라 생각합니다. 내가 읽고 즐기고있다는 것을 제외하고 무슨 말을해야할지 모르겠어요. 멋진 블로그. 나는 자주이 블로그를 방문하게됩니다.

    2011.11.23 01:04 [ ADDR : EDIT/ DEL : REPLY ]
  2. 가장 감사해야 할 것은 신이 주신 능력을 제대로 이용하는 것이다.

    2013.03.24 14:09 [ ADDR : EDIT/ DEL : REPLY ]
  3. 그 사람됨을 알고자 하면 그의 친구가 누구인가를 알아보라.

    2013.03.30 23:46 [ ADDR : EDIT/ DEL : REPLY ]
  4. 아름다운 여자가 해바라기하는 걸 좋아해요

    2013.04.03 05:15 [ ADDR : EDIT/ DEL : REPLY ]
  5. 한세계를 놓고 말하면 당신은 한 사람이지만,단 한사람을 놓고 말하면 당신은 그라삼의 세계입니다

    2013.04.07 04:00 [ ADDR : EDIT/ DEL : REPLY ]
  6. 다른 사람에서 다른 사람의 정신적 활동을 이해하고, 사물을 보는 개념은 자신의 미래에 대해 전혀 걱정할 필요가 없습니다.

    2013.04.08 04:19 [ ADDR : EDIT/ DEL : REPLY ]
  7. 매우 지원, http://ntu.mysonfactoryoutlet.com/ toms shoes, 아주 좋아.

    2013.04.13 23:21 [ ADDR : EDIT/ DEL : REPLY ]
  8. http://www,Topics related articles:


    http://reevid.com/160 复件 (2) 韩

    .christianlouboutinve,Topics related articles:


    http://okcn.tistory.com/entry/140009162434 复件 (12) 韩

    .com http://www,Topics related articles:


    http://lovtea.tistory.com/49 复件 (19) 韩

    .cheapshoesec.com/

    2013.04.21 14:43 [ ADDR : EDIT/ DEL : REPLY ]
  9. 당신 매력있어, 자기가 얼마나 매력있는지 모르는게 당신매력이야

    2013.04.25 14:57 [ ADDR : EDIT/ DEL : REPLY ]
  10. 당신 매력있어, 자기가 얼마나 매력있는지 모르는게 당신매력이야

    2013.07.11 06:15 [ ADDR : EDIT/ DEL : REPLY ]
  11. 슬퍼서 우는거 아니야..바람이 불어서 그래..눈이 셔서..

    2013.07.13 23:02 [ ADDR : EDIT/ DEL : REPLY ]