<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Microsoft KOREA Developer Support</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/kocssdva/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/kocssdva/feed.xml</link>
    <description />
    <lastBuildDate>Tue, 16 Apr 2019 05:16:08 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>AngularJS/SPA 애플리케이션에서 Application Insights 이용하기</title>
      <link>https://docs.microsoft.com/archive/blogs/kocssdva/angularjsspa-application-insights</link>
      <pubDate>Wed, 07 Mar 2018 06:28:34 GMT</pubDate>
      <dc:creator><![CDATA[Manwoo Jeon]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/kocssdva/?p=645</guid>
      <description><![CDATA[Application Insights 는 일반적으로 웹 애플리케이션의 성능 혹은 예외정보와 같은 유용한 정보를 자동적으로 수집함으로써 웹 애플리케이션을 모니터링 할 수...]]></description>
      <content:encoded><![CDATA[<span style="font-size: small"><span style="font-family: 맑은 고딕"><span style="color: #000000"><span lang="EN-US"></span></span></span></span>

Application Insights 는 일반적으로 웹 애플리케이션의 성능 혹은 예외정보와 같은 유용한 정보를 자동적으로 수집함으로써 웹 애플리케이션을 모니터링 할 수 있습니다. 또한, Application Insights를 page script에 간단히 추가함으로써 페이지로드 및 AJAX 호출 시간, 브라우저 예외 및 AJAX 실패의 수 및 세부 사항등에 대한 모니터링 정보를 얻을 수 있습니다.

다음은 AngularJS/SPA를 위한 Application Insights의 사용방법에 대한 소개입니다. 해당 방법은 <a href="http://ngmodules.org/modules/angular-appinsights">http://ngmodules.org/modules/angular-appinsights</a> 에서 제공되는 AppInsights와 관련한 Angular 모듈과 <a href="http://www.c-sharpcorner.com/article/single-page-application-using-web-api-and-angularjs">http://www.c-sharpcorner.com/article/single-page-application-using-web-api-and-angularjs</a> 에서 제공되는 AngularJS/SPA 샘플코드를 이용해서 설정 가이드 합니다.

먼저, Azure Subscription이 있다면 Azure 포탈(<a href="https://portal.azure.com/#create/hub">https://portal.azure.com/#create/hub</a>)에서 Monitoring+Management 를 선택하고 Application Insights를 선택하여 Application insights 리소스를 생성합니다.

생성한 Application Insights portal 로 들어가서 “getting started” 들어갑니다. 그리고, “monitor and diagnose client side application”을 선택하면, 아래의 이미지와 같이 page script에 추가할 AppInsights 관련 script code를 얻을 수 있습니다.

<a href="https://msdnshared.blob.core.windows.net/media/2018/03/Appinsights_portal.jpg"><img width="1148" height="618" class="alignnone size-full wp-image-685" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/03/Appinsights_portal.jpg" /></a>

&nbsp;

상위의 <span>site</span>에서 얻어진 <span>script </span>코드를 <span>copy</span>하여 우선 <span>AppInsights.js</span>라는 이름으로 파일생성합니다<span>. </span>이때<span>, instrumentationKey:"<em>&lt;</em></span><em>키 생략<span>&gt;</span></em><span>" </span>코드 부분은 삭제합니다<span>. </span>

그리고 <a href="http://ngmodules.org/modules/angular-appinsights"><span>http://ngmodules.org/modules/angular-appinsights </span></a>에서 제공하는 <span>angular-appinsights.js </span>를 <span>download </span>합니다<span>. </span>

해당 두 <span>script code</span>는 아래와 같이 적절한 위치에 포함합니다<span>. </span>예를 들어<span>, <a href="http://www.c-sharpcorner.com/article/single-page-application-using-web-api-and-angularjs/">http://www.c-sharpcorner.com/article/single-page-application-using-web-api-and-angularjs/</a> </span>예제에서는 <span>Views\index.html</span>의 <span>head tag</span>안에 <span>script tag</span>를 이용하여 포함합니다<span>.</span>
<pre><span>&lt;script src="../Scripts/AppInsights.js"&gt;&lt;/script&gt;</span>

<span>&lt;script src="../Scripts/angular-appinsights.js"&gt;&lt;/script&gt; </span></pre>
이후에 해당<span> application bootstrap </span>안에 <span>angular-appinsights </span>를 초기화 합니다<span>. </span>아래의 예는<span> SPA</span>예제코드의 <span>theMusic.js </span>파일안에서 <span>angular-appinsights</span>를 위해 추가된 코드를 빨간 블럭으로 표시했습니다<span>.</span>

<a href="https://msdnshared.blob.core.windows.net/media/2018/03/script1.jpg"><img width="909" height="231" class="alignnone size-full wp-image-665" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/03/script1.jpg" /></a>

중요한 것은 insightsProvider.start(); 에 parameter로 전달하는 값이 application insights azure portal에서 제공하는 instrumentationKey 입니다. 이는 application insights azure portal안에 properties 메뉴에서 얻을 수 있습니다.

이와 같이 angular-appinsights가 초기화되었다면, SPA관련 controller 마다 insightsProvider가 제공하는 trackPageView() 를 호출함으로써 간단하게 Page View load time 로그를 전송할 수 있습니다. 아래의 예는 SPA 예제코드의 detailscontroller.js 파일안에서 trackPageView()를 호출하는 코드를 빨간 블럭으로 표시했습니다.

<a href="https://msdnshared.blob.core.windows.net/media/2018/03/script2.jpg"><img width="738" height="278" class="alignnone size-full wp-image-675" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/03/script2.jpg" /></a>

지금까지 정상적으로 설정이 되었다면, 해당 AngularJS/SPA 애플리케이션에서 navigation을 할 경우에 설정되어 있는 trackPageView() 함수가 로그를 Application Insights portal 로 전송할 것입니다. 이를 확인하기 위해서 Application Insights Azure Portal에서 browser 메뉴를 선택하면 다음과 같은 Page View 화면을 볼 수 있습니다.

<a href="https://msdnshared.blob.core.windows.net/media/2018/03/browser_menujpg.jpg"><img width="1148" height="624" class="alignnone size-full wp-image-695" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/03/browser_menujpg.jpg" /></a>

자세히 살펴보면, 앞에서 AppInsights를 추가한 DetailsController와 관련한 page view load time이 기록되는 것을 확인할 수 있습니다.

<a href="https://msdnshared.blob.core.windows.net/media/2018/03/pageview.jpg"><img width="1402" height="634" class="alignnone size-full wp-image-655" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/03/pageview.jpg" /></a>]]></content:encoded>
    </item>
    <item>
      <title>C#을 이용한 Azure Text Analytics API / Sentiment Analysis 예제</title>
      <link>https://docs.microsoft.com/archive/blogs/kocssdva/azure-text-analytics-api-sentiment-analysis-sample-using-cs</link>
      <pubDate>Wed, 21 Feb 2018 06:26:15 GMT</pubDate>
      <dc:creator><![CDATA[Manwoo Jeon]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/kocssdva/?p=615</guid>
      <description><![CDATA[Azure 가 제공하는 Cognitive Service 중에 Text Analytics API 는 텍스트에 포함된 감정을 추측할 수 있는 독특한 API를 제공해준다. 예를 들어,...]]></description>
      <content:encoded><![CDATA[Azure 가 제공하는 Cognitive Service 중에 Text Analytics API 는 텍스트에 포함된 감정을 추측할 수 있는 독특한 API를 제공해준다. 예를 들어, “I had a wonderful experience! The rooms were wonderful and the staff was helpful.” 라는 문장을 보면 해당 표현이 긍정적임을 직관적으로 이해할 수 있는 데, 해당 문장에 대한 sentiment에 대한 분석을 해당 API를 통해 요청한다면, 0부터 1사이의 값으로 긍정적인지 부정적인지를 답해준다. 상위의 예에 해당하는 결과는 0.96으로 매우 긍정적이라고 알려준다 (여러 가지 언어를 제공하지만, 한글은 아직 지원하지 않고 있다).

이런 시나리오를 생각해 본적이 있는가? 예를 들어 우리가 흔히 접하는 일부 뉴스들에 대해서 얼마나 부정적인 기사들이 많이 언급되는 가를 Sentiment Analysis API로 분석한다면 어떨까? 다음은 그와 같은 예제를 어떻게 구현할 수 있을지 소개하고자 한다.

Azure subscription이 있다면, Azure Portal(http://portal.azure.com)에 들어가서 New &gt; AI+ Cognitive Services 를 클릭하면, Text Analytics API를 생성할 수 있다. 리소스가 생성이 되면, resource management에서 Keys 를 확인할 수 있는 데, 해당 key를 일단 확보해 둔다. 이는 API를 호출할 때 필요하다. 대부분의 cognitive service 는 이와 유사하게 리소스를 만들고, key를 확보한 후에 API 호출 시 HTTP header에 해당 key를 포함하여 전송함으로써 응답을 받을 수 있다.

코드는 아래와 같은 pattern 이다.
<pre>var uri = "https://eastasia.api.cognitive.microsoft.com/text/analytics/v2.0/sentiment";
var json = "{\"documents\": [{\"id\": \"1\",\"text\": \"" + node._summary + "\"}]}";
 
var client = new HttpClient();
 
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "1234567890abcdefghijklmnopqrstuv");  // 32자리 key
 
HttpResponseMessage response;
 
byte[] byteData = Encoding.UTF8.GetBytes(json);
 
using (var content = new ByteArrayContent(byteData))
{
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    using (response = await client.PostAsync(uri, content))
    {
 
        var result = await response.Content.ReadAsStringAsync();
 
        var body = JsonConvert.DeserializeObject&lt;SentimentBatchResult&gt;(result);
        if (body != null)
        {
            if (body.Documents != null)
            {
                foreach (var document in body.Documents)
                {
                    Console.WriteLine("Subject: {0}, Sentiment Score: {1:0.00}",
                        node._subject.ToString(), document.Score);
                }
            }
        }
    }
}</pre>
몇 가지 언급하자면, Ocp-Apim-Subscription-Key 는 미리 언급했던 azure portal에서 얻어지 key값을 header에 넣어 전송하기 위해 필요한 항목이다. node._summary 는 뉴스 기사의 요약본 문자열이고, Sentiment API를 통해서 긍부정 여부를 확인할 것이다. Sentiment API를 통해서 전달받은 결과는 json 형태로 전달받을 것이고, deserialize를 위해서 사용하는 SentimentBatchResult type은 nuget package를 통해서 Microsoft.Azure.CognitiveServices.Language preview 버전을 설치하여 이용하였다.

테스트를 위한 뉴스 요약본은 다음과 같이 간단하게 얻어서 테스트할 수 있다.
<pre>using (WebClient client = new WebClient())
{
    string data = client.DownloadString(_url);
 
    Rss20FeedFormatter rss = new Rss20FeedFormatter();
    rss.ReadFrom(XmlReader.Create(new StringReader(data)));
 
    SyndicationFeed feed = rss.Feed;
 
    foreach (SyndicationItem item in feed.Items)
    {
        string subject = item.Title.Text;
 
        if (item.Summary != null)
        {
 
            string t = item.Summary.Text;
            t = Regex.Replace(t, @"&lt;.+?&gt;", String.Empty);
            t = WebUtility.HtmlDecode(t);
 
            //Console.WriteLine($"{t}");
            _list.Add(new ListNode(subject, t));
        }
    }
}</pre>
예를 들어, _url 은 https://news.google.com/news/rss/search/section/q/Korean%2BBusiness%2Banalysis/Korean%2BBusiness%2Banalysis?hl=en&amp;gl=US&amp;ned=u
와 같이 입력하여 Korean business analysis 라는 키워드로 검색한 영어 기사를 RSS로 간단히 받았으며, 뉴스 요약본을 추출하여 Sentiment API로 긍부정을 확인하기 위한 텍스트로 사용하였다.

테스트를 해보면, 기대한 만큼 분석 결과가 유용하지 않을 수도 있다. 아래와 같이 뉴스 subject과 score값을 출력하여 해당 뉴스의 요약본이 나타내고 있는 긍부정을 확인할 수 있다. 대부분이 0.5이고 3개정도의 기사만 긍정적이라고 표시하고 부정적인 기사는 없는 것으로 보이는 데, 뉴스의 텍스트가 대부분 팩트의 전달을 목적으로 하다 보니 감정적으로 건조해서 그럴 수도 있겠다 싶다.

<a href="https://msdnshared.blob.core.windows.net/media/2018/02/result.jpg"><img width="782" height="434" class="alignnone size-full wp-image-625" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/result.jpg" /></a>]]></content:encoded>
    </item>
    <item>
      <title>Ubuntu 환경에서 .NET Core의 profiling 및 postmortem debugging</title>
      <link>https://docs.microsoft.com/archive/blogs/kocssdva/ubuntu-net-core-profiling-postmortem-debugging</link>
      <pubDate>Thu, 28 Dec 2017 03:54:57 GMT</pubDate>
      <dc:creator><![CDATA[Manwoo Jeon]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/kocssdva/?p=545</guid>
      <description><![CDATA[Ubuntu(16.04) 환경에서 .NET Core 애플리케이션에서 대한 CPU Profiling은 기존의 Windows 환경에서 사용했던 PerfView라는 툴을 이용할 수...]]></description>
      <content:encoded><![CDATA[Ubuntu(16.04) 환경에서 .NET Core 애플리케이션에서 대한 CPU Profiling은 기존의 Windows 환경에서 사용했던 PerfView라는 툴을 이용할 수 있다.

CPU profiling을 위해서 우선 perfcollect 라는 툴을 Ubuntu 환경에 설치해야 한다.
<pre>curl -OL http://aka.ms/perfcollect
sudo chmod +x perfcollect
sudo ./perfcollect install</pre>
설치가 완료 되면, 다음과 같은 순서로 CPU sampling을 할 수 있다.

애플리케이션을 수행할 terminal 창에서 아래를 수행한다.
<pre>export COMPlus_PerfMapEnabled=1
export COMPlus_EnableEventLog=1</pre>
이후에 perfcollect를 수행할 terminal 창을 하나 더 연후에 아래를 수행하여 CPU sampling을 시작한다.
<pre>sudo ./perfcollect collect hicputrace</pre>
수행과 더불어 sampling은 시작된다.

이후에는 애플리케이션 수행창에서 애플리케이션을 수행한다. 그리고 일정 시간이 흐른 후에 perfcollect가 호출되었던 창에서 ctrl+c를 눌러 중지하면, 현 directory에 hicputrace.trace.zip 파일이 생성된다. 해당 trace 파일은 windows 환경에서 perfview (http://aka.ms/perfview) 툴을 이용하여 볼 수 있다.

Perfview.exe 가 위치한 폴더에 Ubuntu에서 수집된 trace 파일을 위치하고 perfview를 실행하면 아래와 같은 화면을 볼 수 있다.
<a href="https://msdnshared.blob.core.windows.net/media/2017/12/perfveiw_open.jpg"><img width="1180" height="685" class="alignnone size-full wp-image-577" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/perfveiw_open.jpg" /></a>

이후에 해당 zip파일을 click 하면, 아래와 같이 profile 정보를 볼 수 있다.

특히, 보고자 하는 것이 .NET core 애플리케이션의 CPU 점유 call stack을 확인하는 것이므로, CallTree 메뉴에서 dotnet process를 check 하고 tree를 확장하면, CPU를 점유하고 있는 call stack을 볼 수 있다.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/perfview_calltree.jpg"><img width="2043" height="828" class="alignnone size-full wp-image-585" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/perfview_calltree.jpg" /></a>

아쉽게도 PerfCollect 툴은 현재 Memory Profiling은 제공하지 않는 다. 만일, Memory Profiling과 같은 정보를 추출하려면 core dump를 통해서 .NET managed memory사용량을 확인할 수 있다. 그 방법에 대해서는 다음과 같다.

먼저, Core dump를 수집하는 방법은 여러가지가 있으나, dump의 size를 고려해 볼 때, 아래의 방법을 생각해 볼 수 있다. 우선 애플리케이션의 수행에 앞서서 아래의 명령을 수행하여 충분한 size의 덤프를 생성할 수 있도록 한다.
<pre>ulimit -c Unlimited</pre>
그리고, 애플리케이션을 수행하여 메모리가 충분히 누수가 되는 시점에 새로운 terminal 창을 오픈하여 아래와 같이 애플리케이션을 중지시키면 해당 시점에 덤프가 떨어진다.
<pre>sudo kill -4 &lt;pid&gt;</pre>
덤프는 애플리케이션 수행시점의 현재폴더 혹은 /var/crash 폴더에서 확인할 수 있다.
core덤프를 수집하는 일반적인 방법은 다음과 같다. Gdb를 이용하는 방법이다.
<pre>sudo apt-get install gdb
sudo gdb</pre>
이후에 ps -efH 를 이용하여 pid값을 얻은 후에 gdb를 attach 한다.
<pre>attach &lt;pid&gt;</pre>
Gdb가 attach 된 이후에 적절한 시점에 generate-core-file 명령을 통해서 core file을 얻을 수 있다.
<pre>generate-core-file &lt;core file path&gt;</pre>
이후 덤프분석을 위해 해당 덤프를 lldb 디버거를 통해서 오픈 할 수 있다. Gdb에서 사용할 수 있는 .NET Core plugin이 존재하지 않기 때문에 lldb 디버거를 사용해야 한다.

아래는 “core” 라는 이름의 core file을 lldb 디버거에서 오픈한다.
<a href="https://msdnshared.blob.core.windows.net/media/2017/12/load_coredump.jpg"><img width="1074" height="109" class="alignnone size-full wp-image-576" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/load_coredump.jpg" /></a>
그리고, libsosplugin.so 파일을 load 한다.
<pre>plugin load /usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.0/libsosplugin.so
setclrpath /usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.0</pre>
먼저, Libsosplugin.so 에서 제공하는 “eeheap –gc” 명령을 통해서 해당 프로세스가 사용하고 있는 전체 managed memory의 size를 알 수 있다.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/eeheap.jpg"><img width="1084" height="237" class="alignnone size-full wp-image-555" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/eeheap.jpg" /></a>

“dumpheap –stat” 명령은 해당 managed memory 영역내에서 개별적으로 메모리를 사용하는 오브젝트들의 정보를 알 수 있다.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/dumpheap1.jpg"><img width="1081" height="215" class="alignnone size-full wp-image-595" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/dumpheap1.jpg" /></a>

메모리 누수에 대해서 검토한다면, count와 TotalSize가 큰 오브젝트들이 사실은 관심대상이다. 아래를 보면, System.Byte[]가 그 중 많은 메모리를 점유하고 있다.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/dumpheap2.jpg"><img width="1083" height="131" class="alignnone size-full wp-image-605" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/dumpheap2.jpg" /></a>

System.Byte[]의 MethodTable의 정보는 00007f8138ba1210 이며, 10565개의 동일한 타입의 오브젝트가 존재하는 것을 알 수 있다.  “dumpheap -mt” 명령어는 System.Byte[]타입의 오브젝트들을 나열해준다.
<pre>dumpheap –mt 00007f8138ba1210

</pre>
상위의 명령을 수행하면, &lt;MT&gt; &lt;Address&gt; &lt;Size&gt; 의 배열로 나열된 정보를 확인할 수 있다. 그리고, “dumpobj” 명령은 “dumpheap -mt” 명령의 결과값에 존재하는 address 값을 parameter로 사용하여 개별적인 오브젝트의 정보를 출력한다.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/dumpobj.jpg"><img width="1084" height="324" class="alignnone size-full wp-image-606" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/dumpobj.jpg" /></a>

사실 중요한 것은 해당 오브젝트를 사용하는 코드이다. 그 정보를 확인할 수 있는 명령이 gcroot 인데, 아래와 같이 덤프에서는 정상적으로 출력이 되지 않는다.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/gcroot.jpg"><img width="1078" height="90" class="alignnone size-full wp-image-565" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/gcroot.jpg" /></a>

하지만, lldb(3.6)를 문제가 발생하고 있는 애플리케이션에 직접 붙여서 확인한다면, 아래와 같은 정보를 확인할 수 있다.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/gcroot2.jpg"><img width="1084" height="329" class="alignnone size-full wp-image-575" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/gcroot2.jpg" /></a>

memleakdemo.Program.ManagedLeak 메소드 안에 존재하는 ArrayList가 System.Byte[]를 참조하고 있다. 그러므로, ArrayList의 Size 가 얼마나 큰지, 그리고, 언제 Byte[]를 release 하는 지 등을 검토함으로써 Memory 문제여부를 isolation할 수 있을 것 같다.
<pre>// memleakdemo.Program.ManagedLeak (System.Object)
private static void ManagedLeak(object s)
{
    State state = (State)s;
    ArrayList list = new ArrayList();

    for (int i = 0; i &lt; state._iterations; i++)
    {
        if (i % 100 == 0)
            Console.WriteLine(string.Format("Allocated: {0}", state._size));

            System.Threading.Thread.Sleep(10);
            list.Add(new byte[state._size]);
    }
}</pre>
그러기 위해서는 결국 얼마나 많은 오브젝트를 살펴보느냐가 필요한데, 이것보다는 이러한 부분을 직관적으로 살펴볼 수 있는 memory profiler가 제공되면 좋을 듯 하다.]]></content:encoded>
    </item>
    <item>
      <title>Ubuntu 환경에서 .NET Core 애플리케이션의 High CPU 분석 가이드</title>
      <link>https://docs.microsoft.com/archive/blogs/kocssdva/01_ubuntu_netcore_highcpu</link>
      <pubDate>Mon, 18 Dec 2017 04:49:14 GMT</pubDate>
      <dc:creator><![CDATA[Manwoo Jeon]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/kocssdva/?p=485</guid>
      <description><![CDATA[다음은 Ubuntu (16.04)에서 수행하는 .NET Core 2.0 기반의 애플리케이션에서 high CPU hang 현상이 발생할 경우에 디버깅하는 방법에 대한...]]></description>
      <content:encoded><![CDATA[다음은 Ubuntu (16.04)에서 수행하는 .NET Core 2.0 기반의 애플리케이션에서 high CPU hang 현상이 발생할 경우에 디버깅하는 방법에 대한 팁이다.

먼저 해당 애플리케이션이 CPU 사용량이 많다는 것을 확인할 수 있는 간단한 방법은 terminal 에서 top 명령어를 수행하는 것이다. 아래는 dotnet 관련 process의 CPU 사용량이 72.8%임을 확인할 수 있다.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/top.jpg"><img width="1082" height="171" class="alignnone size-full wp-image-495" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/top.jpg" /></a>

이후에 원인을 찾기 위해 해당 프로세스에 lldb 디버거를 attach하여 애플리케이션의 동작을 살펴보자. top 명령의 출력에서 확인할 수 있었던 pid(4359)값을 이용하여 해당 프로세스에 lldb를 attach할 수 있다. (process attach –p &lt;pid&gt;)

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/attach.jpg"><img width="1081" height="239" class="alignnone size-full wp-image-505" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/attach.jpg" /></a>

중요한 점은 디버거에서 많은 CPU를 점유하고있는 thread 를 찾아야 한다. 해당 process에서 CPU 점유가 많은 thread를 확인하는 방법은 ps 명령어를 이용하는 방법이 있다. 다음의 ps명령어는 많은 CPU(83.3%)를 점유하고 있는 thread의 tid(4367)를 찾을 수 있다. &lt; ps –eLo pid,llwp,ruser,pcpu,args &gt;

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/ps.jpg"><img width="1085" height="189" class="alignnone size-full wp-image-535" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/ps.jpg" /></a>

이제 lldb 디버거에서 해당 thread를 살펴볼 차레이다. 먼저, thread list 명령은 tid값이 4367인 thread를 확인할 수 있다.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/thread_list.jpg"><img width="1078" height="212" class="alignnone size-full wp-image-536" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/thread_list.jpg" /></a>

해당 thread는 managed thread 이므로, libsosplugin.so를 이용하여 동작중인 callstack을 확인해야 한다. 그러므로, 다음과 같은 명령을 통해서 libsosplugin.so를 디버거에 load한다.
<pre> plugin load /usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.0/libsosplugin.so
 setclrpath /usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.0</pre>
Libsosplugin.so가 load 된 이후에 clrthreads를 통해 실제 접근해야할 managed thread의 정보를 얻을 수 있다.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/clrthreads.jpg"><img width="1084" height="306" class="alignnone size-full wp-image-525" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/clrthreads.jpg" /></a>

Thread list 명령에서 확인된 tid값 4367은 hex값으로 110f 이다. 그러므로, OSID값이 110f인 managed thread를 확인하기 위해 setsostid 명령을 통해서 다음과 같이 해당 thread로 설정한다.
<pre> setsostid 110f 4</pre>
이후에 “clrstack” 명령을 통해 해당 thread에 대한 callstack을 살펴볼 수 있다.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/clrstack.jpg"><img width="1081" height="327" class="alignnone size-full wp-image-515" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/clrstack.jpg" /></a>

그 다음은 해당 코드를 리뷰해서 CPU 점유율이 높은 이유에 대해서 찾아야 한다. 실제, 코드를 살펴보면 while 구문안에서 뭔가를 처리하고 있는 것을 확인할 수 있다.

해당 코드는 stackoverflow에서 제공하는 sample code를 이용하여 테스트하였다. 위치는 https://stackoverflow.com/questions/2514544/simulate-steady-cpu-load-and-spikes 에 존재하며, Guido Zanon이 제공한 코드를 이용하여 high CPU를 재현하였다.

그런데, sample 애플리케이션은 어떻게 빌드했을까? 그에 대한 간단한 절차는 다음과 같다.
우선 .NET Core 2.0 SDK를 다음과 같이 설치한다.
<pre> sudo apt-get install curl
 curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor &gt; microsoft.gpg
 sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
 sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod xenial main" &gt; /etc/apt/sources.list.d/dotnetdev.list'
 sudo apt-get update
 sudo apt-get install dotnet-sdk-2.0.0</pre>
그리고, 이어서 VS Code 를 설치한다.
<pre> sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" &gt; /etc/apt/sources.list.d/vscode.list'
 sudo apt-get update
 sudo apt-get install code</pre>
이후에 기본적인 console 애플리케이션 project는 다음과 같이 생성할 수 있다.
<pre>mkdir demo3
cd demo3
dotnet new console</pre>
그리고, VS Code 를 실행한 후에, 폴더열기를 해서 생성한 demo3 폴더를 오픈하면, 기본적인 console 애플리케이션 프로젝트가 VS code 안에서 열린다.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/vscode.jpg"><img width="1075" height="344" class="alignnone size-full wp-image-496" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/vscode.jpg" /></a>

이후 sample code를 copy &amp; paste 한 후에 다음을 실행하면 된다.
<pre> dotnet run
 dotnet restore</pre>
결국 copy &amp; paste 가 모든 것을 다했다.]]></content:encoded>
    </item>
    <item>
      <title>Ubuntu 환경에서 .NET Core 어플리케이션의 crash core dump 분석 가이드</title>
      <link>https://docs.microsoft.com/archive/blogs/kocssdva/01_ubuntu_netcore_crashcoredump</link>
      <pubDate>Wed, 13 Dec 2017 04:50:37 GMT</pubDate>
      <dc:creator><![CDATA[Manwoo Jeon]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/kocssdva/?p=405</guid>
      <description><![CDATA[다음은 Ubuntu 기반의 .NET Core 애플리케이션에서 crash가 발생했을 때, core dump를 가지고 postmortem debugging 과정을 기술한...]]></description>
      <content:encoded><![CDATA[다음은 Ubuntu 기반의 .NET Core 애플리케이션에서 crash가 발생했을 때, core dump를 가지고 postmortem debugging 과정을 기술한 내용이다.
Ubuntu (16.04)에서 수행중인 .NET Core 2.0 애플리케이션에서 crash가 발생하면, 애플리케이션 수행 폴더의 위치에서 core dump를 확인할 수 있다.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/01.jpg"></a><a href="https://msdnshared.blob.core.windows.net/media/2017/12/01.jpg"><img width="1065" height="158" class="alignnone size-full wp-image-455" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/01.jpg" /></a>

.NET Core application crash에 기인한 Core dump 파일을 분석하기 위해서는 debugging 환경 구축이 필요한데, 일치하는 .NET Core 버전을 Ubuntu 머신에 설치하고, 이를 load해서 분석할 LLDB 디버거 역시 설치한다.
아래는 terminal을 통해 .NET Core 2.0 SDK의 설치과정이다.
<pre>sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ xenial main" &gt; /etc/apt/sources.list.d/dotnetdev.list'
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 417A0893
sudo apt-get update
sudo apt-get install dotnet-sdk-2.0.0</pre>
그리고, LLDB debugger를 설치한다.
<pre>sudo apt-get install lldb-3.6</pre>
설치가 완료되었다면, LLDB debugger를 통해 core dump 파일을 다음과 같이 오픈한다.
<pre>sudo lldb-3.6 -c core /usr/share/dotnet/dotnet</pre>
<a href="https://msdnshared.blob.core.windows.net/media/2017/12/02.jpg"><img width="1076" height="271" class="alignnone size-full wp-image-465" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/02.jpg" /></a>

&nbsp;

Crash dump에서 무엇보다 먼저 확인하고 싶은 것이 crashed callstack인데, 일반적으로 bt명령어를 이용하여 callstack을 확인한다.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/03.jpg"><img width="1082" height="616" class="alignnone size-full wp-image-466" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/03.jpg" /></a>

&nbsp;

bt 명령을 통해 확인한 back trace에서 frame #7을 보면, 정확한 function정보를 확인할 수 없는 데, 실제적인 .NET callstack을 확인하기 위해서는 .NET Core 에서 제공하는 libsosplugin.so debugger extension을 이용해야 한다. 다음은 해당 extension을 load 하는 과정이다.
<pre>plugin load /usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.0/libsosplugin.so
setclrpath /usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.0</pre>
&nbsp;

이후에는 아래와 같이 managed threads를 확인할 수 있다. 그다음에는 익숙하지만 다른 libsosplugin.so에서 제공하는 명령어를 통해 분석을 할 수 있다.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/04.jpg"><img width="1079" height="312" class="alignnone size-full wp-image-475" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/04.jpg" /></a>

&nbsp;

우선 흔히 생각하는 2번 thread에서 System.ArgumentNullException이 발생한 것으로 확인할 수 있다. 먼저 “setsostid &lt;OSID&gt; &lt;ID&gt;”명령을 통해 해당 thread를 설정한 후에 clrstack 명령어를 통해 managed callstack을 확인할 수 있다.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/05.jpg"><img width="1081" height="220" class="alignnone size-full wp-image-406" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/05.jpg" /></a>

&nbsp;

또 다른 callstack 정보인데, 이 경우에는 MethodDesc 정보를 알 수 있다.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/06.jpg"><img width="1085" height="200" class="alignnone size-full wp-image-416" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/06.jpg" /></a>

&nbsp;

보고자 하는 것은 문제가 발생한 시점의 method 정보이다. MedthodDesc 를 가리키는 주소를 이용하면, IL code를 확인할 수 있다.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/07.jpg"><img width="1080" height="226" class="alignnone size-full wp-image-417" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/07.jpg" /></a>

&nbsp;

System.Text.Encoding()메소드는 parameter로 전달된 Byte[]가 NULL 일 경우에 ArgumentNullException을 출력하는 것으로 보인다. 실제 문제가 된 고객의 코드의 위치는 다음과 같다.  clru 명령어는 문제가 발생한 위치를 (&gt;&gt;&gt;) assembly 코드에서 표시한다.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/08.jpg"><img width="1079" height="788" class="alignnone size-full wp-image-426" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/08.jpg" /></a>

&nbsp;

IL Code와 문제가 발생한 assembly 위치를 비교해보자.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/09.jpg"><img width="1080" height="270" class="alignnone size-full wp-image-435" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/09.jpg" /></a>

&nbsp;

이쯤되면 실제 코드를 확인해 보는 것이 좋겠지만, Syetem.Text.Encoding::get_UTF8에 Syetem.Text.Encoding::GetString의 입력 parameter인 ldarg.0 가 Null Byte Array로 문제가 발생한 것으로 보인다. 그러므로 입력 parameter를 확인해야 하는 데, 이는 다음과 같이 확인할 수 있다.

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/10.jpg"><img width="1082" height="312" class="alignnone size-full wp-image-445" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/12/10.jpg" /></a>

ldarg.0 는 buffer가 가리키는 주소이고, (이것은 NULL 이고 crash의 원인이다.) ldarg.1 은 0x64값으로 보인다. 결국, extension만 load하면, managed debugging은 windbg에서 분석하는 것과 크게 다르지 않다.

&nbsp;]]></content:encoded>
    </item>
    <item>
      <title>Visual C++ 2008 재배포 패키지 설치시 오류 해결 방법</title>
      <link>https://docs.microsoft.com/archive/blogs/kocssdva/visual-c-2008</link>
      <pubDate>Wed, 03 Nov 2010 19:34:20 GMT</pubDate>
      <dc:creator><![CDATA[kocssdva]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/kocssdva/2010/11/03/visual-c-2008/</guid>
      <description><![CDATA[&#160;  Visual C++ 2008 재배포 패키지 는 Microsoft C++ 런타임 라이브러리를 사용하도록 개발된 애플리케이션에서 실행되는데 필요한 런타임 파일들을...]]></description>
      <content:encoded><![CDATA[<p>&#160;</p>  <p>Visual C++ 2008 재배포 패키지 는 Microsoft C++ 런타임 라이브러리를 사용하도록 개발된 애플리케이션에서 실행되는데 필요한 런타임 파일들을 설치하는데 사용됩니다. </p>  <p>일부 시스템에서 Visual C++ 2008 재배포 패키지가 설치되지 않고 오류가 발생하는 문제가 발생할 수 있습니다. 재배포 패키지 자체의 문제가 아니라 설치에 필요한 서비스 프로그램의 동작 오류, 통신 상의 문제, 또는 다른 프로그램에 의한 충돌 이슈 등으로 이러한 문제가 발생할 수 있습니다. 따라서 Visual C++ 2008 재배포 패키지가 설치되지 않을 경우 윈도우 업데이트나 다른 설치 프로그램도 정상적으로 설치가 되지 않는 상황일 가능성이 높습니다.</p>  <p>실제 설치시 오류가 발생하는 장비를 검사해서 어느 부분에 문제가 있는지 확인해야 그 원인을 파악할 수 있지만 여기서는 대표적인 사례를 소개하고 이를 해결하는 방법에 대해서 소개합니다.   <br /></p>  <p><font size="3"><b>[</b><b>증상</b><b>]</b></font></p>  <p>Visual C++ 2008 재배포 패키지 설치시 오류가 발생함</p>  <p><b>     <br /><font size="3">[</font></b><font size="3"><b>원인</b><b>]</b></font></p>  <p>Visual C++ 2008 재배포 패키지를 설치하는 중에 다음과 같은 원인으로 인해서 설치 오류 발생할 수 있습니다. 이 외에도 다른 원인에 의해서 발생할 수 있으며 이 경우에는 진단을 통해 정확한 원인을 파악해야 합니다.</p>  <p><b>1. </b><b>악성</b><b> </b><b>코드에</b><b> </b><b>의해서</b><b> </b><b>설치에</b><b> </b><b>필요한</b><b> </b><b>관련</b><b> </b><b>서비스</b><b> </b><b>프로그램을</b><b> </b><b>종료되는</b><b> </b><b>경우</b><b></b></p>  <p>설치 시에 Windows Installer 서비스나 TrustedInstaller.exe 프로세스와 통신이 필요한데 이러한 관련 서비스들이 악성 코드에 의해서 정상 실행되지 않거나 강제나 종료되는 경우입니다.</p>  <p><b>2. </b><b>다른</b><b> </b><b>프로그램에</b><b> </b><b>의해서</b><b> </b><b>파일이나</b><b> </b><b>레지스트리</b><b> </b><b>접근이</b><b> </b><b>되지</b><b> </b><b>않는</b><b> </b><b>경우</b><b></b></p>  <p>설치에 필요한 파일이나 레지스트리에 대한 접근이 실행 중인 다른 프로그램에 의해서 차단되어 설치 작업이 진행되 못하는 경우입니다. 이는 악성 코드 또는 이로부터 시스템을 보호하는 악성 프로그램에 의해서도 발생할 수 있습니다.</p>  <p><b>3. </b><b>해당</b><b> </b><b>시스템의</b><b> Windows Installer</b><b>서비스에</b><b> </b><b>문제가</b><b> </b><b>있는</b><b> </b><b>경우</b><b></b></p>  <p>설치에 필요한 인스톨러 서비스가 플랫폼에 맞지 않게 설치되거나 기타 이유로 인스톨러 서비스가 정상 동작하지 않는 경우입니다.</p>  <p><b>4. </b><b>일부</b><b> </b><b>윈도우</b><b> </b><b>시스템</b><b> </b><b>파일이</b><b> </b><b>손상된</b><b> </b><b>경우</b><b></b></p>  <p>설치가 필요한지 여부를 확인하기 위해 윈도우 시스템 파일의 버전이나 무결성 등을 확인하는데 이 과정에서 일부 윈도우 시스템 파일이 손상되거나 없어서 설치가 중단된 경우입니다.</p>  <p><b></b></p>  <p><font size="3"><b>[</b><b>해결방법</b><b>]</b></font></p>  <p>다음과 같은 방법으로 문제가 해결되는지 확인 해보시기 바랍니다.</p>  <p><b>     <br />1. </b><b>안전모드로</b><b> </b><b>부팅해서</b><b> </b><b>설치</b><b></b></p>  <p>악성코드나 보안 프로그램 등 다른 프로세스에 의해서 설치 과정이 정상적으로 진행되지 못한 경우 대부분 안전모드로 부팅한 상태에서는 정상적으로 설치가 가능합니다. 안전모드에서는 시작시 운영체제의 기본 서비스와 애플리케이션만 실행됩니다. 따라서 안전모드에서 설치할 경우 설치 프로그램이 실행되는 당시에 외적인 영향으로 설치가 되지 않는 문제를 최소화 할 수 있습니다.</p>  <p>안전모드로 부팅하려면 시스템 부팅 과정에서 F8 키를 누르면 부팅 모드를 선택할 수 있는 화면이 나타납니다. 부팅 모드 목록에서 ‘안전모드로 부팅’을 선택합니다.</p>  <p><b>     <br />2. </b><b>악성코드</b><b> </b><b>검사</b><b></b></p>  <p>일부 악성코드의 경우 안전모드에서도 동작이 되도록 작성된 것이 있습니다. 사용 중인 백신 프로그램으로 시스템을 진단해서 악성코드에 감염되지 않았는지 검사한 후에 설치를 진행해보시기 바랍니다.</p>  <p>사용 중인 백신 프로그램이 없다면 아래와 같은 보안 서비스를 이용할 수도 있습니다.</p>  <p><b>Windows Live OneCare </b><b>서비스</b><b>     <br /></b><a href="http://onecare.live.com/site/ko-kr/default.htm">http://onecare.live.com/site/ko-kr/default.htm</a></p>  <p><b>마이크로소프트</b><b> </b><b>시큐리티</b><b> </b><b>에센셜</b><b> (</b><b>개인사용자용</b><b> </b><b>무료</b><b> </b><b>백신</b><b>)     <br /></b><a href="http://www.microsoft.com/security_essentials/default.aspx">http://www.microsoft.com/security_essentials/default.aspx</a></p>  <p><b>     <br />      <br />3. Windows Installer </b><b>서비스의</b><b> </b><b>재등록</b><b> </b><b>또는</b><b> </b><b>재설치</b><b></b></p>  <p>Windows Installer 서비스가 정상 설치되지 않아서 설치 관련 작업이 진행되지 않는 경우 Windows Installer를 재등록하거나 기존에 설치된 Windows Installer를 삭제하고 재설치하면 문제가 해결될 수 있습니다.</p>  <p>이 작업은 레지스트리 값 수정이나 주요 운영체제 파일을 직접 변경하는 등의 작업을 필요로 합니다. 만일의 경우를 대비해서 작업을 진행하기 전에 먼저 시스템 백업을 하시기 바랍니다.</p>  <p>이에 대한 자세한 내용은 아래 KB 문서 내용을 참고하시기 바랍니다.</p>  <p><b></b></p>  <p><b>Windows Installer</b><b>의</b><b> </b><b>기본적인</b><b> </b><b>문제</b><b> </b><b>해결하기</b><b>     <br /></b><a href="http://support.microsoft.com/kb/907749">http://support.microsoft.com/kb/907749</a></p>  <p><b>     <br />4. </b><b>시스템</b><b> </b><b>파일</b><b> </b><b>검사기</b><b>(SFC.exe) </b><b>도구</b><b> </b><b>이용</b><b></b></p>  <p>주요 운영체제 파일이 누락 또는 손상되거나 하드 디스크에 물리적인 오류가 있어서 설치가 되지 않을 수 있습니다. </p>  <p>현재 운영체제의 시스템 파일의 유효성을 검사하기 위해 시스템 파일 검사기(SFC.exe) 도구를 이용할 수 있습니다. SFC.exe는 운영체제의 주요 파일이 존재하는지 그리고 손상되지 않았는지를 검사하는데 사용됩니다. </p>  <p>관리자 권한으로 명령 프롬프트를 실행하고 sfs /scannow 명령을 수행하면 검사 결과를 확인할 수 있습니다. 자세한 내용은 아래 KB 문서의 내용을 확인하시기 바랍니다.</p>  <p><b>Windows Vista </b><b>또는</b><b> Windows 7</b><b>에서</b><b> </b><b>시스템</b><b> </b><b>파일</b><b> </b><b>검사기</b><b> </b><b>도구를</b><b> </b><b>사용하여</b><b> </b><b>누락되었거나</b><b> </b><b>손상된</b><b> </b><b>시스템</b><b> </b><b>파일</b><b> </b><b>문제를</b><b> </b><b>해결하는</b><b> </b><b>방법</b><b></b></p>  <p><a href="http://support.microsoft.com/kb/929833">http://support.microsoft.com/kb/929833</a></p>  <p><b>     <br />5. </b><b>시스템</b><b> </b><b>복원하기</b><b></b></p>  <p>운영체제의 주요 파일이 손상되어 설치시 오류가 발생하고 기타 시스템의 다른 기능들이 정상 실행되지 않는 경우 시스템 파일을 복원함으로써 문제를 해결할 수 있습니다. </p>  <p>아래 KB 문서에는 운영체제의 설치 CD를 이용하거나 안전모드로 부팅한 상태에서 시스템 복원을 진행하는 방법에 대해서 설명하고 있으므로 참고하시기 바랍니다.</p>  <p><b>Step by Step : Windows Vista </b><b>시스템</b><b> </b><b>복구</b><b> </b><b>방법</b><b></b></p>  <p><a href="http://support.microsoft.com/kb/961793/ko">http://support.microsoft.com/kb/961793/ko</a></p>]]></content:encoded>
    </item>
    <item>
      <title>.NET Framework 2.0 Registration Correction Tool</title>
      <link>https://docs.microsoft.com/archive/blogs/kocssdva/net-framework-2-0-registration-correction-tool</link>
      <pubDate>Wed, 12 Nov 2008 03:56:00 GMT</pubDate>
      <dc:creator><![CDATA[kocssdva]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/kocssdva/2008/11/12/net-framework-2-0-registration-correction-tool/</guid>
      <description><![CDATA[기존 Blogging 한 내용을 보면, 프로그램 추가/삭제 로 해당 Product 이 Uninstall 되지 않을 때, Custom 하게 Uninstall 해야 한다고 하였습니다....]]></description>
      <content:encoded><![CDATA[<P>기존 Blogging 한 내용을 보면, 프로그램 추가/삭제 로 해당 Product 이 Uninstall 되지 않을 때, Custom 하게 Uninstall 해야 한다고 하였습니다. <A href="http://kikiwaka.egloos.com/2161747">http://kikiwaka.egloos.com/2161747</A><BR>즉, Installer 에서 해당 Product 을 선택하여 삭제하고, Registry 값을 삭제하는 등 의 작업을 진행해야 합니다. <BR>하지만, Installer 에서 삭제가 안되는 경우가 발생하는데, 특히 .NET Framework 2.0 과 관련하여 많이 발생 합니다. </P>
<P>‘Installer Database 에서 아래와 같이 문제가 발생하는 .NET Framework 2.0 을 복구했을 경우, 해당 패치 패키지를 찾을 수 없다는 Message 와 함께 복구가 되지 않습니다.’<BR>(시작 &gt; 실행 에서 installer 를 입력하시면 해당 Folder 로 이동합니다.) <BR>
<DIV style="TEXT-ALIGN: center"><IMG class=image_mid onmouseover="this.style.cursor='pointer'" style="CURSOR: pointer" onclick="Control.Modal.openDialog(this, event, 'http://pds12.egloos.com/pds/200811/12/43/e0044243_491a9918acf4e.jpg');" height=34 alt="" src="http://pds12.egloos.com/pds/200811/12/43/e0044243_491a9918acf4e.jpg" width=500 border=0></DIV>
<P mce_keep="true">&nbsp;</P>
<DIV style="TEXT-ALIGN: center"><IMG class=image_mid onmouseover="this.style.cursor='pointer'" style="CURSOR: pointer" onclick="Control.Modal.openDialog(this, event, 'http://pds12.egloos.com/pds/200811/12/43/e0044243_491a992724a7b.jpg');" height=148 alt="" src="http://pds12.egloos.com/pds/200811/12/43/e0044243_491a992724a7b.jpg" width=347 border=0></DIV><BR>%TEMP%\dd_dotNETFX20error.txt 를 확인하여 보면, 다음과 같은 Message 를 확인 할 수 있습니다. <BR><BR>MSI (s) (58:90) [15:02:55:093]: Note: 1: 1314 2: NDP20-KB917283-X86.msp <BR>MSI (s) (58:90) [15:02:55:093]: Unable to create a temp copy of patch 'NDP20-KB917283-X86.msp'.<BR>MSI (s) (58:90) [15:02:55:093]: Note: 1: 1708 <BR>MSI (s) (58:90) [15:02:55:093]: Note: 1: 2729 <BR>MSI (s) (58:90) [15:02:55:093]: Note: 1: 2729 <BR>MSI (s) (58:90) [15:02:55:093]: 제품: Microsoft .NET Framework 2.0 - 설치하지 못했습니다.<BR><BR>MSI (s) (58:90) [15:02:55:093]: MainEngineThread is returning 1635<BR>패치 패키지를 열지 못했습니다. 패치 패키지가 있는지, 액세스할 수 있는지 확인하거나 올바른 Windows Installer 패치 패키지인지 응용 프로그램 공급업체에 문의하십시오.<BR>C:\temp\dotnet\netfx.msi<BR>MSI (c) (3C:C4) [15:02:55:093]: Decrementing counter to disable shutdown. If counter &gt;= 0, shutdown will be denied. Counter after decrement: -1<BR>MSI (c) (3C:C4) [15:02:55:093]: MainEngineThread is returning 1635<BR><BR>이는 Windows Installer Database 가 Broken 되어 발생한 것입니다. <BR>(.NET Framework 2.0 patch 에 대한 Information 이 Windows Installer Database 에 missing 되면서 발생한 것입니다.)<BR>따라서, 해당 Product 을 삭제하거나, 복구할 수 없는 문제가 발생하는 것입니다. <BR><BR>이러한 증상은 다음과 같은 경우에 발생합니다. <BR>
<UL>
<LI>시스템 도구&gt;디스크 정리 에서 자주 사용하지 않는 시스템 파일을 삭제 시 문제가 발생할 수 있습니다. <BR>이는 msp (Patch File) 인 경우 해당 Location 에 존재하기 때문입니다. 
<LI>%windir%\Installer 에 있는 File 을 임의로 변경하였을 때 문제가 발생할 수 있습니다.</LI></UL>
<P>이를 해결하기 위해서 다음과 같이 Microsoft .NET Framework 2.0 Registration Correction Tool 를 제공하고 있습니다. <BR><A href="http://www.microsoft.com/downloads/details.aspx?FamilyID=0BA6038C-061E-4B4A-9BE9-96A323701260&amp;displaylang=en">http://www.microsoft.com/downloads/details.aspx?FamilyID=0BA6038C-061E-4B4A-9BE9-96A323701260&amp;displaylang=en</A><BR></P>]]></content:encoded>
    </item>
    <item>
      <title>Application CleanUp tool for reinstalling</title>
      <link>https://docs.microsoft.com/archive/blogs/kocssdva/application-cleanup-tool-for-reinstalling</link>
      <pubDate>Thu, 16 Oct 2008 05:21:00 GMT</pubDate>
      <dc:creator><![CDATA[kocssdva]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/kocssdva/2008/10/16/application-cleanup-tool-for-reinstalling/</guid>
      <description><![CDATA[Microsoft Product 설치 Issue 를 진행하다 보면, 해당 Product 을 재 설치 해야 하는 경우가 생깁니다. 프로그램 추가/삭제 를 통해서 해당...]]></description>
      <content:encoded><![CDATA[Microsoft Product 설치 Issue 를 진행하다 보면, 해당 Product 을 재 설치 해야 하는 경우가 생깁니다. <BR>프로그램 추가/삭제 를 통해서 해당 Application 을 Uninstall 하는 것을 권장합니다만 프로그램 추가/삭제 에서 해당 Application 이 삭제가 되지 않는 상황을 겪을 수 있습니다. (이는 MSI Database 가 깨졌을 때 발생합니다만...) <BR>이를 간편히 해결할 수 있는 Tool&nbsp;들이 있습니다.&nbsp;<BR>&nbsp;<BR>Windows Installer CleanUp Tool 과 Microsoft Program Manager 로 있는 Aaron Stebner 의 Blog 에서 구할 수 있는 .NET Framework CleanUp Tool 입니다. <BR><BR><STRONG>Microsoft Installer (MSI) 에 대한 CleanUp Tool</STRONG><BR>이 Tool 은 어디까지나&nbsp;MSI 정보를 삭제할 뿐 실제&nbsp;Product&nbsp;은 Uninstall 하지 않습니다.&nbsp;<BR>따라서, Custom 하게 해당 Product 을 Unintall 하셔야 합니다. <BR>(C:\Windows\installer 에서 해당 MSI 또는 MSP 를 선택해서 Uninstall 하는 방법 등) <BR>무엇보다 해당 Product 과 관련하여 manually 하게 Uninstall 하는 방법을 기술한 KB를 참조하셔서 해당 Product 을&nbsp;Uninstall 하는 것이 좋습니다.<BR><A href="http://support.microsoft.com/kb/290301/ko">http://support.microsoft.com/kb/290301/ko</A><BR><BR><STRONG>.NET Framework 관련한 CleanUp tool (.NET Framework 1.x, 2.0, 3.0, 3.5)<BR></STRONG>어디까지나 정상적인 방법으로 삭제되지 않을 때 사용하셔야 합니다. <BR><A href="http://blogs.msdn.com/astebner/archive/2006/05/30/611355.aspx">http://blogs.msdn.com/astebner/archive/2006/05/30/611355.aspx</A> ]]></content:encoded>
    </item>
    <item>
      <title>How to configure IIS when publishing ClickOnce</title>
      <link>https://docs.microsoft.com/archive/blogs/kocssdva/how-to-configure-iis-when-publishing-clickonce</link>
      <pubDate>Thu, 16 Oct 2008 05:20:00 GMT</pubDate>
      <dc:creator><![CDATA[kocssdva]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/kocssdva/2008/10/16/how-to-configure-iis-when-publishing-clickonce/</guid>
      <description><![CDATA[IIS 는 특정 파일에 대하여 사용자가 다운로드 받을 수 없도록 설정이 되어 있습니다. 만일 이러한 환경설정이 되어 있지 않다면, Web.config 와 같은 File 을 사용자가...]]></description>
      <content:encoded><![CDATA[IIS 는 특정 파일에 대하여 사용자가 다운로드 받을 수 없도록 설정이 되어 있습니다. <BR>만일 이러한 환경설정이 되어 있지 않다면, Web.config 와 같은 File 을 사용자가 다운로드 받을 수 있기 때문에, 보안에 심각한 취약점이 나타나게 됩니다. <BR>(Web.config 는 사용자의 이름과 암호와 같은 중요한 정보가 포함될 수 있습니다.) <BR><BR>따라서, IIS 에서는 ClickOnce 에서 사용하는 특정 File Extension 만을 사용할 수 있도록 설정해 주어야 합니다. <BR><BR>MIME type 설정에 다음과 같이 추가합니다. <BR>.vsto 는 VSTO 를 배포할 때 추가합니다. <BR>
<TABLE class=MsoNormalTable style="BORDER-COLLAPSE: collapse; mso-yfti-tbllook: 1184; mso-padding-alt: 0cm 0cm 0cm 0cm" cellSpacing=0 cellPadding=0 border=0 class="MsoNormalTable">
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
<TD class="" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 238.95pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" vAlign=top width=319>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 굴림"><SPAN style="FONT-SIZE: 100%">파일 확장명<SPAN lang=EN-US><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></SPAN></SPAN></P></TD>
<TD class="" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 238.95pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" vAlign=top width=319>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 굴림"><SPAN style="FONT-SIZE: 100%">콘텐츠 형식<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 1">
<TD class="" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 238.95pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" vAlign=top width=319>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-FAMILY: 굴림"><SPAN style="FONT-SIZE: 100%">.application<o:p></o:p></SPAN></SPAN></P></TD>
<TD class="" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 238.95pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" vAlign=top width=319>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-FAMILY: 굴림"><SPAN style="FONT-SIZE: 100%">application/x-ms-application<o:p></o:p></SPAN></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 2">
<TD class="" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 238.95pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" vAlign=top width=319>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-FAMILY: 굴림"><SPAN style="FONT-SIZE: 100%">.manifest<o:p></o:p></SPAN></SPAN></P></TD>
<TD class="" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 238.95pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" vAlign=top width=319>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-FAMILY: 굴림"><SPAN style="FONT-SIZE: 100%">application/x-ms-manifest<o:p></o:p></SPAN></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 3">
<TD class="" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 238.95pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" vAlign=top width=319>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-FAMILY: 굴림"><SPAN style="FONT-SIZE: 100%">.deploy<o:p></o:p></SPAN></SPAN></P></TD>
<TD class="" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 238.95pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" vAlign=top width=319>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-FAMILY: 굴림"><SPAN style="FONT-SIZE: 100%">application/octet-stream<o:p></o:p></SPAN></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 4; mso-yfti-lastrow: yes">
<TD class="" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 238.95pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" vAlign=top width=319>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-FAMILY: 굴림"><SPAN style="FONT-SIZE: 100%">.vsto<o:p></o:p></SPAN></SPAN></P></TD>
<TD class="" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 238.95pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" vAlign=top width=319>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-FAMILY: 굴림"><SPAN style="FONT-SIZE: 100%">application/x-ms-vsto<o:p></o:p></SPAN></SPAN></P></TD></TR></TBODY></TABLE>]]></content:encoded>
    </item>
    <item>
      <title>How to add custom prerequisite in ClickOnce</title>
      <link>https://docs.microsoft.com/archive/blogs/kocssdva/how-to-add-custom-prerequisite-in-clickonce</link>
      <pubDate>Thu, 16 Oct 2008 05:18:00 GMT</pubDate>
      <dc:creator><![CDATA[kocssdva]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/kocssdva/2008/10/16/how-to-add-custom-prerequisite-in-clickonce/</guid>
      <description><![CDATA[Visual Studio 2008 은 아래 Folder 에 Bootstrapper package 를 관리하고 있습니다. \Program Files\Microsoft...]]></description>
      <content:encoded><![CDATA[Visual Studio 2008 은 아래 Folder 에 Bootstrapper package 를 관리하고 있습니다. <BR>\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\<BR><BR>이는 다음 Registry에서 관리 하고 있습니다. <BR>HKLM\Software\Microsoft\GenericBootstrapper\3.5 의 Path key<BR>즉, 위의 Key Path 값을 변경하면 Bootstapper 참조가 달라집니다. <BR><BR>Bootstrapper Package 를 추가하려면 다음 조건을 만족해야 합니다. <BR>
<OL>
<LI>EXE 또는 MSI file 로 구성된 Redistributable Component 로 구성되어야 합니다. 
<LI>Product Manifest file 인 product.xml 이 포함되어야 합니다. 이는 언어에 중립적인 Metadata 로서 언어에 종속적이지 않은 일반적인 Metadata 입니다. 
<LI>Package Manifest file 인 package.xml 이 포함되어야 합니다. 이는 일반적으로 각 언어별 에러 메시지를 포함하고 있습니다. Component 는 적어도 하나 이상의 package manifest 를 포함하고 있어야 합니다.</LI></OL>
<P>Product 과 Package Manifest Schema 에 대한 명세는 다음을 참조하셔서 작성하셔야 합니다. <BR><A href="http://msdn.microsoft.com/en-us/library/ms229223.aspx">http://msdn.microsoft.com/en-us/library/ms229223.aspx</A></P>
<P>Visual Studio 2008 SP1 을 설치하면 다음과 같이 필수 구성 요소를 선택 할 수 있습니다.</P>
<UL>
<LI>.NET Framework 2.0 (x86) 
<LI>Visual C++ Runtime Libraries (IA64) 
<LI>Visual C++ Runtime Libraries (x64) 
<LI>Visual C++ Runtime Libraries (x86) 
<LI>Windows Installer 3.1 
<LI>.NET Framework Client Profile 
<LI>.NET Framework 3.0 (x86) 
<LI>.NET Framework 3.5 
<LI>.NET Framework 3.5 SP1 
<LI>Crystal Reports Basic for Visual Studio 2008 (x86, x64) 
<LI>Microsoft Office 2007 Primary Interop Assembiles 
<LI>Microsoft Visual Stduio 2008 Report Viewer 
<LI>Microsoft Visual Basci PowerPacks 1.2 
<LI>Visual Studio Tools for Office system 3.0 Runtime Service Pack 1 
<LI>SQL Server 2005 Exprerss Edition SP2 (x86)</LI></UL>
<P>예를 들어, <BR>Visual Studio Tools for the Office system 3.0 Runtime 과 Visual Studio Tools for the Office system 3.0 Runtime Service Pack1 을 분리하려면, 다음과 같이 하셔야 합니다. <BR></P>
<OL>
<LI>\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\ 에 VSTOR30 과 VSTOR30SP1 Folder 를 생성합니다. 
<LI>각각의 Folder 에 Redistributable Package 를 복사합니다. 
<LI>product.xml 을 생성합니다. 
<P>
<TABLE class=MsoNormalTable style="MARGIN: auto auto auto 38pt; BORDER-COLLAPSE: collapse; mso-yfti-tbllook: 1184; mso-padding-alt: 0cm 0cm 0cm 0cm" cellSpacing=0 cellPadding=0 border=0 class="MsoNormalTable">
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
<TD class="" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 477.9pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" vAlign=top width=637>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&lt;?xml version="1.0" encoding="utf-8" ?&gt;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&lt;!--<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">***********************************************************************<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; Copyright (C) Microsoft Corporation.&nbsp; All rights reserved.<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;THIS CODE AND INFORMATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;PARTICULAR PURPOSE.<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">***********************************************************************<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">--&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><o:p><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;</SPAN></o:p></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&lt;Product <o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; xmlns="</SPAN><A href="http://schemas.microsoft.com/developer/2004/01/bootstrapper"><SPAN style="COLOR: #0000ff; FONT-FAMILY: 맑은 고딕">http://schemas.microsoft.com/developer/2004/01/bootstrapper</SPAN></A><SPAN style="FONT-FAMILY: 맑은 고딕">" <o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; ProductCode="Microsoft.VSTORuntime.3.0"&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; &lt;RelatedProducts&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp; &lt;DependsOnProduct Code="Microsoft.Net.Framework.3.5" /&gt;&nbsp; <o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; &lt;/RelatedProducts&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; &lt;!-- Defines the list of files to be copied on build. --&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; &lt;PackageFiles CopyAllPackageFiles="false"&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp; &lt;PackageFile Name="VSTOR30.exe" HomeSite="VSTORExe" PublicKey="3082010A0282010100A2DB0A8DCFC2C1499BCDAA3A34AD23596BDB6CBE2122B794C8EAAEBFC6D526C232118BBCDA5D2CFB36561E152BAE8F0DDD14A36E284C7F163F41AC8D40B146880DD98194AD9706D05744765CEAF1FC0EE27F74A333CB74E5EFE361A17E03B745FFD53E12D5B0CA5E0DD07BF2B7130DFC606A2885758CB7ADBC85E817B490BEF516B6625DED11DF3AEE215B8BAF8073C345E3958977609BE7AD77C1378D33142F13DB62C9AE1AA94F9867ADD420393071E08D6746E2C61CF40D5074412FE805246A216B49B092C4B239C742A56D5C184AAB8FD78E833E780A47D8A4B28423C3E2F27B66B14A74BD26414B9C6114604E30C882F3D00B707CEE554D77D2085576810203010001"/&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; &lt;/PackageFiles&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><o:p><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;</SPAN></o:p></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; &lt;InstallChecks&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp; &lt;MsiProductCheck Property="VSTORuntimeInstalled" Product="{8FB53850-246A-3507-8ADE-0060093FFEA6}"/&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; &lt;/InstallChecks&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><o:p><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;</SPAN></o:p></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; &lt;!-- Defines how to run the Setup package. --&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; &lt;Commands Reboot="Defer"&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp; &lt;Command <o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PackageFile="VSTOR30.exe" <o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Arguments=' /q:a /c:"install /q /l"' <o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EstimatedInstalledBytes="10000000" <o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EstimatedTempBytes="10000000"<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EstimatedInstallSeconds="60"&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;InstallConditions&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;BypassIf Property="VSTORuntimeInstalled" Compare="ValueGreaterThanOrEqualTo" Value="3"/&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- Requires the user to be an admin user when installing the prerequisite --&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;FailIf Property="AdminUser" Compare="ValueEqualTo" Value="false" String="AdminRequired"/&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/InstallConditions&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ExitCodes&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ExitCode Value="0" Result="Success"/&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ExitCode Value="1641" Result="SuccessReboot"/&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ExitCode Value="3010" Result="SuccessReboot"/&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;DefaultExitCode Result="Fail" FormatMessageFromSystem="true" String="GeneralFailure" /&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ExitCodes&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp; &lt;/Command&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; &lt;/Commands&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-para-margin-left: 0gd" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&lt;/Product&gt;</SPAN></SPAN><SPAN style="COLOR: #000000"><o:p></o:p></SPAN></P></TD></TR></TBODY></TABLE>&nbsp;<BR>&nbsp; 
<TABLE class=MsoNormalTable style="MARGIN: auto auto auto 38pt; BORDER-COLLAPSE: collapse; mso-yfti-tbllook: 1184; mso-padding-alt: 0cm 0cm 0cm 0cm" cellSpacing=0 cellPadding=0 border=0 class="MsoNormalTable">
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
<TD class="" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 477.9pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" vAlign=top width=637>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&lt;?xml version="1.0" encoding="utf-8" ?&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&lt;!--<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">***********************************************************************<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; Copyright (C) Microsoft Corporation.&nbsp; All rights reserved.<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;THIS CODE AND INFORMATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;PARTICULAR PURPOSE.<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">***********************************************************************<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">--&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><o:p><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;</SPAN></o:p></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&lt;Product <o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; xmlns="</SPAN><A href="http://schemas.microsoft.com/developer/2004/01/bootstrapper"><SPAN style="COLOR: #0000ff; FONT-FAMILY: 맑은 고딕">http://schemas.microsoft.com/developer/2004/01/bootstrapper</SPAN></A><SPAN style="FONT-FAMILY: 맑은 고딕">" <o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; ProductCode="Microsoft.VSTORuntime.3.0.SP1"&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><o:p><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;</SPAN></o:p></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; &lt;RelatedProducts&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp; &lt;DependsOnProduct Code="Microsoft.Net.Client.3.5" /&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; &lt;/RelatedProducts&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><o:p><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;</SPAN></o:p></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; &lt;!-- Defines the list of files to be copied on build. --&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; &lt;PackageFiles CopyAllPackageFiles="false"&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp; &lt;PackageFile Name="vstor30sp1-KB949258-x86.exe" HomeSite="VSTOR30SP1" PublicKey="3082010A0282010100A2DB0A8DCFC2C1499BCDAA3A34AD23596BDB6CBE2122B794C8EAAEBFC6D526C232118BBCDA5D2CFB36561E152BAE8F0DDD14A36E284C7F163F41AC8D40B146880DD98194AD9706D05744765CEAF1FC0EE27F74A333CB74E5EFE361A17E03B745FFD53E12D5B0CA5E0DD07BF2B7130DFC606A2885758CB7ADBC85E817B490BEF516B6625DED11DF3AEE215B8BAF8073C345E3958977609BE7AD77C1378D33142F13DB62C9AE1AA94F9867ADD420393071E08D6746E2C61CF40D5074412FE805246A216B49B092C4B239C742A56D5C184AAB8FD78E833E780A47D8A4B28423C3E2F27B66B14A74BD26414B9C6114604E30C882F3D00B707CEE554D77D2085576810203010001"/&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; &lt;/PackageFiles&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><o:p><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;</SPAN></o:p></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; &lt;InstallChecks&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp; &lt;RegistryCheck Property="VSTORuntimeUpdateInstalled" Key="HKLM\SOFTWARE\Microsoft\VSTO Runtime Setup\v3" Value="Update"/&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; &lt;/InstallChecks&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><o:p><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;</SPAN></o:p></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; &lt;!-- Defines how to run the Setup package. --&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; &lt;Commands Reboot="Defer"&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp; &lt;Command<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PackageFile="vstor30sp1-KB949258-x86.exe"<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Arguments=' /q:a /c:"install /q /l"' <o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EstimatedInstalledBytes="1500000"<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EstimatedTempBytes="1500000"<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EstimatedInstallSeconds="60"&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;InstallConditions&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;BypassIf Property="VSTORuntimeUpdateInstalled" Compare="ValueGreaterThanOrEqualTo" Value="1"/&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- Requires the user to be an admin user when installing the prerequisite --&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;FailIf Property="AdminUser" Compare="ValueEqualTo" Value="false" String="AdminRequired"/&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/InstallConditions&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ExitCodes&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ExitCode Value="0" Result="Success"/&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ExitCode Value="1641" Result="SuccessReboot"/&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ExitCode Value="3010" Result="SuccessReboot"/&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;DefaultExitCode Result="Fail" FormatMessageFromSystem="true" String="GeneralFailure"/&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ExitCodes&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp;&nbsp;&nbsp; &lt;/Command&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt 40pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&nbsp; &lt;/Commands&gt;<o:p></o:p></SPAN></SPAN></P>
<P class=MsoListParagraph style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: keep-all; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-para-margin-left: 0gd" align=left><SPAN lang=EN-US style="FONT-SIZE: 8pt; COLOR: black"><SPAN style="FONT-FAMILY: 맑은 고딕">&lt;/Product&gt;</SPAN></SPAN><U><SPAN style="COLOR: #000000"><o:p></o:p></SPAN></U></P></TD></TR></TBODY></TABLE></P><BR>
<LI>en folder 를 생성하여, eula.rtf 및 package.xml 을 생성합니다. 
<DIV style="TEXT-ALIGN: center"><IMG class=image_mid onmouseover="this.style.cursor='pointer'" onclick="Control.Modal.openDialog(this, event, 'http://pds10.egloos.com/pds/200810/16/43/e0044243_48f6deca680eb.jpg');" height=73 alt="" src="http://pds10.egloos.com/pds/200810/16/43/e0044243_48f6deca680eb.jpg" width=247 border=0></DIV><BR>
<LI>Visual Studio 2008 을 재 시작하면 다음과 같이 필수 구성요소에 VSTOR30 과 VSTOR30SP1 이 분리되어 나타나는 것을 확인 할 수 있습니다. 
<DIV style="TEXT-ALIGN: center"><IMG class=image_mid onmouseover="this.style.cursor='pointer'" style="CURSOR: pointer" onclick="Control.Modal.openDialog(this, event, 'http://pds11.egloos.com/pds/200810/16/43/e0044243_48f6df1222121.jpg');" height=150 alt="" src="http://pds11.egloos.com/pds/200810/16/43/e0044243_48f6df1222121.jpg" width=500 border=0></DIV></LI></OL>]]></content:encoded>
    </item>
  </channel>
</rss>