한동안 떠들석하게 했던 그 업데이트입니다.

스펙터의 경우엔  Bios업데이트로 해결을, 멜트다운 문제는 윈도우 업데이트로 해결이 가능합니다.


메인PC의 경우 업그레이드 한지 얼마 안되어서 그런지, bios업데이트가 있었지만, 구형 PC에는 bios가 아직

나오지 않았더군요. 둘다 기가바이트꺼 인데 ㅠ.ㅠ


https://www.ashampoo.com/en/usd/pin/1304/security-software/spectre-meltdown-cpu-checker


위 링크에서 제공해주는 툴로 쉽게 확인이 가능합니다.


메인PC. 모두 업데이트해서 잘 됬다고 나오고요.






* 기가바이트 메인보드의 경우, 최신 바이오스 파일을 다운로드 받으신 후, USB저장매체등에 복사를 해두고,

재부팅 한 후, F8키를 누르면 바이오스 업데이모드로 진입합니다.

스펙터 해결을 위한 바이오스 업데이트.


서브컴.. 


윈도우7의 경우 업데이트시에는 아래와 같이 나타날 수 있습니다.

Windows Management Framework version5가 필요하다고 하여 업데이트를 해줘야 할 수도 있습니다.






해당하는 윈도우 버전을 체크하여 다운로드 받은 후 설치하면 그 이후에야 멜트다운 관련 업데이트를 진행할 수 있습니다.




이후 윈도우즈에 업데이트 항목에서 보안업데이트를 진행합니다.






바이오스 업데이트가 지원되지 않아 여전히 스펙터에 취약한 서브 컴 ㅠ.ㅠ

본체에서 탈착 할 수 있는 조이콘으로 닌텐도 스위치의 마리오 카트는 2인용을 바로 즐길 수 있습니다.

주말에 애들 게임시켜주면 서로 할려고 난리인데, 조이콘 하나씩 안겨주고 대결하라고 하니

딱이더군요.


처음에 설정하는 법을 몰라 좀 헤맸는데, 이것도 간단합니다.

마리오카트 중에, 패드를 분리하면, 아래와 같은 화면이 나옵니다.




왼쪽을 먼저 분리해 보았습니다.









중간에 좀 작은 화면으로 안내 화면이 보입니다.

패드에  SL키와 SR키를 누르면 분리해서 설정이 가능합니다.









SL키 와 SR키는 아래 화면에 빨간색 박스로 표시된 부분입니다.



역시 같은 방법으로 오른쪽 조이콘도 분리하여 설정하면 됩니다.




설정이 완료되면 버튼 4개중 오른쪽 버튼을 누름니다.






아래처럼 2인 플레이가 가능합니다.


코드를 예쁘게 보이게 하기위해 Syntax highlighting을 붙혔습니다.


적용하는 방법은 아래 링크를 참고하시면 됩니다.

http://mclass.tistory.com/54



그런데, 어떤 소스코드를 붙히니까 자꾸 </t>가 붙더군요.

첨에 왜 그러지..했는지 확인해보니. HTML모드를 하고서는 소스코드 내용에 '<' '>' 문자가 문제였더군요.

HTML모드에서는 < > 문자는 태그로 인식되어서 그랬던 것이었습니다.


해서 강제로 < 는 &lt;   > 는 &gt; 로 바꾸고 등록했습니다.

&는 &amp; , 빈공백은 &nbsp;로 해줘야겠지만 그러한 문자는 없어서 패스했습니다.



즉 태그 내용 등록시 아래처럼 말이죠.



<pre class="brush: csharp">

using System.ComponentModel;


namespace RxTestWinForm

{

    public static class ControlExtension

    {

        /// &lt;summary&gt;

        /// T Type의 Delegate  선언

        /// &lt;/summary&gt;

        /// &lt;typeparam name="T"&gt;T타입&lt;/typeparam&gt;

        /// &lt;param name="obj"&gt;Invoke 할 컨트롤 &lt;/param&gt;

public delegate void RunOnUIThreadDelegate&lt;T&gt;(T obj) where T : ISynchronizeInvoke;

        /// &lt;summary&gt;

        /// ISynchoronizeInvoke 인터페이스 구현체 대한 RunOnUIThread확장 메소드

        /// &lt;/summary&gt;

        /// &lt;typeparam name="T"&gt;T타입, 캐스팅을 피하기 위해 사용&lt;/typeparam&gt;

        /// &lt;param name="obj"&gt;메소드 확장할 컨트롤&lt;/param&gt;

        /// &lt;param name="action"&gt;수행할 Action&lt;/param&gt;

        public static void RunOnUIThread&lt;T&gt;(this T obj, RunOnUIThreadDelegate&lt;T&gt; action)

            where T : ISynchronizeInvoke

        {

            if (obj.InvokeRequired)

            {

                obj.Invoke(action, new object[] { obj });

            }

            else

            {

                action(obj);

            }

        }

    }

}

</pre>





그런데 이렇게 안하고, 그냥, 아래 코드로 먼저 HTML 에서 입력하고 난 뒤,


<pre class="brush: csharp">

</pre>


에디트 모드로 돌아가면 회색 사각형이 보이는데, 거기서 그냥 코드 입력하면, 굳이 위에 처럼 귀찮게 문자 바꾸지 않고도

잘 등록이 되더군요.



위 화면에서 바로 코드를 입력하면 됩니다.


윈폼 컨트롤 사용시 타 쓰레드에서 컨트롤 변경호출시 컨트롤의 InvokeRequired 확인하고 처리하는 코드가 너저분해지기 마련입니다.

이런 류 코드는 많이 쓰일 것 같은데... 



간단히 이렇게도 가능하지만, 

   textBox1.Invoke( new Action (() => { textBox1.Text = count.ToString(); } ));



좀 더 효율적으로 동작하기 위한 방법들을 찾아보았습니다.
아래 링크에 좋은 의견들이 많았습니다.
그 중 깔끔하게 사용하는 방법을 옮겨 포스팅합니다.




WinForm.cs (아래처럼 활용하시면 됩니다.)
-----------------------------------------------------------
//메인쓰레드가 아닌 다른 쓰레드에서 UI 변경 호출시
label1.RunOnUIThread(control =>
{

     control.Text = $"{progressCount}/{totalCount}";;

});





다음 확장메소드를 선언합니다.


ControlExtension.cs

----------------------------------------------------------------------------


using System.ComponentModel;

namespace RxTestWinForm
{
    public static class ControlExtension
    {
        /// <summary>
        /// T Type의 Delegate  선언
        /// </summary>
        /// <typeparam name="T">T타입</typeparam>
        /// <param name="obj">Invoke 할 컨트롤 </param>
	public delegate void RunOnUIThreadDelegate<T>(T obj) where T : ISynchronizeInvoke;
        /// <summary>
        /// ISynchoronizeInvoke 인터페이스 구현체 대한 RunOnUIThread확장 메소드
        /// </summary>
        /// <typeparam name="T">T타입, 캐스팅을 피하기 위해 사용</typeparam>
        /// <param name="obj">메소드 확장할 컨트롤</param>
        /// <param name="action">수행할 Action</param>
        public static void RunOnUIThread<T>(this T obj, RunOnUIThreadDelegate<T> action)
            where T : ISynchronizeInvoke
        {
            if (obj.InvokeRequired)
            {
                obj.Invoke(action, new object[] { obj });
            }
            else
            {
                action(obj);
            }
        }
    }
}








닌텐도 스위치가 한국에서 정식 발매된지도 벌써 한달 반정도 된 것 같습니다.

wiiU를 건너띄고 발매되어 더욱 기대를 많이 하게 되었는데요.


기본 조이콘의 그립감이 똥망이라, 프로콘을 구입하는 유저들도 많은 것 같습니다.


프로콘이 USB-C타입으로 연결되는데, PC에서도 잘 안식되고 좋더군요.

PC에서 무선 블루투스로 연결이 가능해 에뮬레이터등에서도 이용이 가능합니다.


근데 PC에서 블루투스 설정 후, 다시 닌텐도 스위치에 연결하려니까 잘 안되더군요.


해서 해결한 방법을 좀 남겨두려합니다.


방법은 본체랑 패드를 USB로 연결하면 자동으로 인식됩니다. (참 쉽죠;;;)


그런데 패드 및 본체모두 USB-C타입 작은모양이라 케이블이 없으면 연결이 불가능합니다.


다행히 독에 일반 USB 잭이 있습니다. 이쪽으로 연결하시면 됩니다.





본체화면에서 설정화면 들어가기.

메뉴에서 Controllers를 들어갑니다.

Find Controllers 메뉴를 선택합니다.

연결을 확인합니다.







다시 재밌게 즐기시면 됩니다.



애플 앱스토어의 리젝은 워낙 유명하기 때문에, 애플 리젝은 원,투 당해도 멘탈에 타격이 거의 없습니다만, 플레이스토어에서는 앱스토어보다 상대적으로 승인 요건이 덜 빡빡하기 때문에, 리젝당하면 역으로 받는 멘탈 충격이 큽니다.


그렇기 때문에, 최소한 앱을 개발한다면, 이러이러한 이유때문에 리젝될수 있다는 정도는 확인해두고 첨부터 기획을 하는게 좋을것 같습니다.

아래 개발자 정책센터의 내용을 꼭 한번은 일독할 필요가 있습니다.


https://play.google.com/intl/ko/about/developer-content-policy/#!?modal_active=none







참 힘든게 구글에서 딱 찝어서 뭐가 문제다라고 알려주지도 않습니다. 정책보고 이 분류에 대해서 위반했으니 확인하라 정도입니다.

웹앱의 경우 좀 조심해야할 것 같습니다. 실제 도메인의 소유자인지를 입증해야합니다. 또한 스크린샷이나 앱에다가 타사의 로고를 절대로 넣지 않도록합니다. 

제휴관계라면 제휴했다는 입증서류를 제출해야합니다. 별로 중요한게 아니라면 차라리 TEXT로 대체하는 것이 좋습니다.


다음카카오에 다니는 게임 퍼블리싱 관련일을 하는 친구녀석에 말로는, 앱에 유명캐릭터(예, 원피스)가 표시될 경우 설사 반다이남코사랑 제휴했더라도. 구글쪽에 별도의 입증서류가 들어가지 않으면 무조건 리젝이랍니다. 주의해야겠습니다.


복원을 위한 이의제기를 통해, 제휴 관련 서류, 사업자등록증등을 제출하여 해결을 할 수 있습니다. 이번 경우에는 관련 서류를 제출하여, 정지상태에서 삭제 상태로 (복원?)처리되었으며, 설명에 해당 로고등을 빼고 재 심사 신청을 하여 무사히 등록할 수 있었습니다.


확실히 영업시간기준 72내에 처리를 해주는군요.

카카오챗봇기능을 통해 간단하게 챗에 응답하는 챗봇을 제작할 수 있습니다.





기본적인 구성방법은 아래 링크를 참조하시면됩니다.

http://kjcoder.tistory.com/505


위 링크는 서버가 C#기준으로 되어있기 때문에 PHP로 구성하는 방법을 알려드립니다.


 운영 환경 

PHP 5.6 / NGINX 12.2 

 디렉토리

 [웹루트]/index.php





NGINX와 PHP-FPM 구성은 생략합니다. 

https://launchdog.wordpress.com/2016/04/22/centos7-nginx-php7-mariadb-%EC%84%A4%EC%B9%98-1/


위 링크에 설명을 잘해 놓았으니 참고하도록합니다. 

위 링크는 PHP7기준입니다. 참고로 저는 호환성을 위해 PHP5.6을 선택하였습니다.



kakao 챗봇 서비스를 위한 nginx 서버 설정

콘피그파일에 아래와 같이 구성합니다. (/etc/nginx/conf.d/default.conf 수정)


   location ~ /kakao   {

        try_files $uri $uri/ /index.php?/$request_uri;

    }



카카오에서 요청되는 주소는 http://[도메인]/kakao/keyboard 형식으로 호출되도록하기위해 위와 같이 구성합니다.

실제 실행파일은 웹루트/index.php 입니다. 

route를 rewrite시키는 효과를 냅니다.





참고로 PHP 스크립트 설정은 아래와 같이 하였습니다.(php-fpm/nginx 설정시 미리 하기도 합니다.)



  location ~ \.php$ {

        root           /var/www/html;

        fastcgi_pass   127.0.0.1:9000;

        fastcgi_index  index.php;

        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

        include        fastcgi_params;

    }





    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

    #

    location ~ \.php/([a-zA-Z0-9_]+)/([0-9]+)$ {

        root           /var/www/html;

        fastcgi_pass   127.0.0.1:9000;

        fastcgi_index  index.php;

        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

        include        fastcgi_params;

    }



static 파일 서비스는 아래와 같구요..

    location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
        expires 12M;
        access_log off;
        add_header Cache-Control "public";
    }

    location ~* \.(?:css|js)$ {
        expires 1y;
        access_log off;
        add_header Cache-Control "public";
    }



그 다음 index.php 파일 내용입니다.

단촐합니다.



<?php

header('Content-Type: application/json');

$uri = $_SERVER["REQUEST_URI"];


if($uri=='/kakao/keyboard') {

//if(!is_kakao_server()) return; #호출 서버가 카카오서버가 아니면 실행안되도록 함.

$data = array();

$data['type'] = 'text';

echo json_encode($data);

return;

}


if($uri=='/kakao/message') {

//if(!is_kakao_server()) return;  #호출 서버가 카카오서버가 아니면 실행안되도록 함.

$postdata = file_get_contents("php://input");

$message = json_decode($postdata);

//$message->content

//$message->user_key

//$message->type  

// 위 변수로 접근 가능하다. 적절하게 처리.


###  적절한 처리..


$data = array('message'=>array('text'=>'잘 처리되었어요.~등등등'));   //메시지 응답을 한다.

echo json_encode($data);

return;

}



#끝~

아 참고로 is_kakao_server()는 카카오서버의 요청만 처리하도록 확인하는 함수입니다.

function is_kakao_server()
{
$kakao_server = array('110.76.143.234','110.76.143.235','110.76.143.236');
return in_array($_SERVER['REMOTE_ADDR'], $kakao_server);
}

요렇게 구성하시면 됩니다.




개발시, 오류수정은, 오류를 찾는것이 90%요. 나머지 고치는것이 10%입니다.

로그는 한 줄기의 빛...!


안드로이드 앱 개발시 APK패키징 이후, APK 수동 배포시 알 수 없게도. 아래와 같이 오류메시지를 뱉고는 더이상 진행 불가했습니다.



이렇게 될 경우, 안드로이드 스튜디오와 같은 개발툴에 연결된 상태도 아니기 때문에 딱히 왜 그런지에 대한 이유도 얻기 힘듭니다.

구글링 해보니, manifest 파일이 잘 못되었거나, 패키지명이 잘못되었거나. 지웠던파일이 지워지지 않고 남아있었다. 라던가.. 

다양한 이유가 있다고합니다.

저의 경우는 모두 아니였습니다.


결론 부터 이야기하자면, 제 경우는 앱 패키징할 때, 

아래와 사이닝 옵션창에서 V2만 체크되어서 그러한 문제가 발생했던 것이었습니다.


V1, V2모두 체크해야 한다.

V1, V2모두 체크해야 한다.


안드로이드 7.0에서는 APK설치시 문제없었으나, 6.0에서 설치시 말썽을 일으키더군요.

아래는 Gradle 빌드 설정 정보입니다.




build.gradle 파일 내용 -------------


android {
compileSdkVersion 27
buildToolsVersion "27.0.0"
defaultConfig {
applicationId "com.myapp"
minSdkVersion 17
targetSdkVersion 27
versionCode 1
versionName "1.0"
vectorDrawables.useSupportLibrary = true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ext {
supportLibraryVersion = '27.0.0'
playServicesVersion = '11.0.4'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

# 이하 중략 #

2017.11.19 기준.최신 SDK입니다.



포스팅 하려는 이유는 이 같은 문제로만 한정하지 않고, 설치 오류가 보다 더 다양한 문제가 있을 수 있다고 생각이 들었습니다.

그 경우, 원인을 찾아야 해결 할 수 있으므로 원인 찾는 법에 대해서 이야기하고자 합니다.


우선 테스트 기기를 PC에 꽂아 주고, CMD창에서 adb shell logcat 명령어로 기기의 상태를 볼 수 있습니다.

물론 Android SDK가 path 걸려 있어야지요.

거기다가 필터를 걸어 볼 수 있는데 대략 이런 식입니다.

adb shell logcat [보고자하는TAG:디버그이상은 D, (E,I,W.등등)] *:S    #*:S 를 넣어줘야 그외는 다 제외시켜주고 보여줍니다.


자세한 설명은 https://developer.android.com/studio/command-line/logcat.html?hl=ko 에 있습니다.

설치와 관련된 경우 PackageManager 태그를 통해 정보를 보여주니까 이렇게 필터를 걸면 되겠습니다.





아래는 필터를 걸지 않고 그냥 봤는데, 아무튼 설치오류와 관련된 정보를 알 수 있었습니다.


재미있는 것이. 어찌 E(Error) 표시가 아니고 W(Warning)으로 표시됩니다.


오류메시지를 확인했으니, 해결방법은 금방 찾죠.

https://stackoverflow.com/questions/44386464/android-app-installation-failed-package-com-my-app-has-no-certificates-at-entry



두어번 했는데도, 과정이 나한테는 너무 복잡하고 한방에 잘 되지 않아서, 트러블 슈팅했던 것들은 남겨주고자한다.

opendkim까지 잘 설정해야 지메일에서 스팸으로 안빠지고 메일이 잘 도착한다.





확인사항,


1.도메인 TXT에는

v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7L41itYZtbf9aAUNFVhau17jg6LnPKWFCj8inG13jgj0bLULd31y7qjtN8YddnUzZqN+dtDoXKg/c2t1Wq6HQFi6I7DNv1ipJOmAPbs05zRwprXClgb/aj2bzhHUm5NzCNwsyvRT8CSLagH2FpSNMXIKVTCIeKdLhkzAAt68j2QIDAQAB

형식으로 입력하면 된다.


2. opendkim 파일에 수정할 것 좀 있다.

특히 Mode    v --> sv로 바꾸고

나머지 설명은 아래 링크 참조해서 읽어서 잘 확인한다.


3. 에러는 /var/log/maillog 에 보이므로,  tail -f 해서 보도록 하자. 에러로그를 봐야 원인을 알 수 있다. 권한문제등등.


4. 메일서버 호스트를 굳이 mail.domain.com 형식으로 할필요는 없다.

호스트이름도 domain.com으로 다 통일해서 설정하였다.


5. socket형식으로 해서는 제대로 되지 않았다.

opendkim.conf  설정


/etc/postfix/main.cf

smtpd_milters           = inet:localhost:12301



6. 보내는 메일주소 맞추기

/etc/postfix/main.cf 파일 수정


smtpd_milters           = inet:localhost:12301

# mtpd_milters           =  /var/run/opendkim/opendkim.sock

non_smtpd_milters       = $smtpd_milters

milter_default_action   = accept

milter_protocol         = 2

virtual_alias_maps = hash:/etc/postfix/virtual


vi /etc/postfix/virtual 

p@domain    user2031

형식으로 작성하고난뒤


sudo postmap /etc/postfix/virtual

service postfix restart #centos 6.6 


한다. 이걸해야 p@domain 으로 서버에서 메일을 보낼 수있다.






메일의 원본내용을 봤을때 DKIM이 PASS가 떠야한다!








참고.

https://takeshiyako.blogspot.kr/2016/01/spf-dkim-postfix-centos.html

https://kr.minibrary.com/278/

https://serverfault.com/questions/640316/milter-service-needs-transportendpoint-instead-of-var-run-opendkim-opendkim-s

개발환경 : windows10 pro 64bit / Visual Studio 2015 Community / .net 4.7 / WebApi

운영환경 : windows7 pro 64bit / IIS 7


환경셋팅하고 게시하니 아래와 같은 오류가 났다.

'/' 응용 프로그램에 서버 오류가 있습니다.

파일이나 어셈블리 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 액세스가 거부되었습니다.

설명: 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 스택 추적을 검토하여 발생한 오류 및 코드에서 오류가 발생한 위치에 대한 자세한 정보를 확인하십시오. 

예외 정보: System.IO.FileLoadException: 파일이나 어셈블리 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 액세스가 거부되었습니다.

소스 오류: 

현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 생성되었습니다. 아래의 예외 스택 추적을 사용하여 예외의 원인 및 위치 정보를 확인할 수 있습니다.


어셈블리 로드 추적: 다음 정보는 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 어셈블리를 로드할 수 없는 이유를 알아내는 데 도움이 됩니다.

경고: 어셈블리 바인딩 로깅이 꺼져 있습니다.
어셈블리 바인딩 오류 로깅 기능을 사용하려면 레지스트리 값 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD)를 1로 설정하십시오.
참고: 어셈블리 바인딩 오류 로깅 기능을 사용하도록 설정하면 그렇지 않은 경우보다 성능이 약간 떨어집니다.
이 기능을 끄려면 레지스트리 값 [HKLM\Software\Microsoft\Fusion!EnableLog]를 제거하십시오.


스택 추적: 

[FileLoadException: 파일이나 어셈블리 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 액세스가 거부되었습니다.]
   System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type) +0
   System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName) +95
   System.RuntimeType.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark) +53
   System.Type.GetType(String typeName) +42
   System.CodeDom.Compiler.CompilerInfo.get_IsCodeDomProviderTypeValid() +14
   System.Web.Compilation.CompilationUtil.GetRecompilationHash(CompilationSection ps) +2528
   System.Web.Configuration.CompilationSection.get_RecompilationHash() +109
   System.Web.Compilation.BuildManager.CheckTopLevelFilesUpToDateInternal(Int64 cachedHash) +526
   System.Web.Compilation.BuildManager.CheckTopLevelFilesUpToDate(Int64 cachedHash) +57
   System.Web.Compilation.BuildManager.ExecutePreAppStart() +148
   System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +878

[HttpException (0x80004005): 파일이나 어셈블리 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 액세스가 거부되었습니다.]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +525
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +124
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +700



버전 정보: Microsoft .NET Framework 버전:4.0.30319; ASP.NET 버전:4.7.2117.0




해결:

원인은 Visual Studio 기본 프로젝트 템플릿의 문제. 운영환경 설정에서는 로슬린 컴파일러가 설정안되서 생긴 문제인듯하다.

필요없으니 제거하면된다.


web.config 에서 아래 부분을 주석처리하거나 삭제한다.

  <!--

  <system.codedom>

    <compilers>

      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701"/>

      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>

    </compilers>

  </system.codedom>-->



참고 링크 : https://stackoverflow.com/questions/36338138/file-load-exception-microsoft-codedom-providers-dotnetcompilerplatform




그다음 또 아래와 같은 오류가 났다.

'/' 응용 프로그램에 서버 오류가 있습니다.

'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 어셈블리에서 'System.ServiceModel.Activation.HttpModule' 형식을 로드할 수 없습니다.

설명: 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 스택 추적을 검토하여 발생한 오류 및 코드에서 오류가 발생한 위치에 대한 자세한 정보를 확인하십시오. 

예외 정보: System.TypeLoadException: 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 어셈블리에서 'System.ServiceModel.Activation.HttpModule' 형식을 로드할 수 없습니다.

소스 오류: 

현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 생성되었습니다. 아래의 예외 스택 추적을 사용하여 예외의 원인 및 위치 정보를 확인할 수 있습니다.


스택 추적: 

[TypeLoadException: 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 어셈블리에서 'System.ServiceModel.Activation.HttpModule' 형식을 로드할 수 없습니다.]
   System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type) +0
   System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName) +95
   System.RuntimeType.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark) +53
   System.Type.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase) +44
   System.Web.Compilation.BuildManager.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase) +61
   System.Web.Configuration.ConfigUtil.GetType(String typeName, String propertyName, ConfigurationElement configElement, XmlNode node, Boolean checkAptcaBit, Boolean ignoreCase) +49

[ConfigurationErrorsException: 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 어셈블리에서 'System.ServiceModel.Activation.HttpModule' 형식을 로드할 수 없습니다.]
   System.Web.Configuration.ConfigUtil.GetType(String typeName, String propertyName, ConfigurationElement configElement, XmlNode node, Boolean checkAptcaBit, Boolean ignoreCase) +558
   System.Web.Configuration.ConfigUtil.GetType(String typeName, String propertyName, ConfigurationElement configElement, Boolean checkAptcaBit) +30
   System.Web.Configuration.Common.ModulesEntry.SecureGetType(String typeName, String propertyName, ConfigurationElement configElement) +57
   System.Web.Configuration.Common.ModulesEntry..ctor(String name, String typeName, String propertyName, ConfigurationElement configElement) +54
   System.Web.HttpApplication.BuildIntegratedModuleCollection(List`1 moduleList) +191
   System.Web.HttpApplication.GetModuleCollection(IntPtr appContext) +1086
   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +123
   System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +169
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +396
   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +333

[HttpException (0x80004005): 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 어셈블리에서 'System.ServiceModel.Activation.HttpModule' 형식을 로드할 수 없습니다.]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +525
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +124
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +700



버전 정보: Microsoft .NET Framework 버전:4.0.30319; ASP.NET 버전:4.7.2117.0



이건 iis 재설정해줘야한다. 왜그런지는 몰겠고. 닷넷하고 iis 설정해보면 고질적으로 나타나는 문제다.(요즘은 잘모르겠다만 윈7환경때까진 진짜 많이 나왔다.)


우선 CMD창에서 아래 디렉토리로 이동한다.


cd %windir%\Microsoft.NET\Framework\v4.0.30319

64비트 환경인경우 아래다.

cd %windir%\Microsoft.NET\Framework64\v4.0.30319 

디렉토리를 이동하였으면 아래명령어를 쳐주면..된다.

aspnet_regiis.exe /iru






참고링크:

https://support.microsoft.com/ko-kr/help/2015129/error-message-after-you-install-the--net-framework-4-0-could-not-load


+ Recent posts