PPAM 파일 소스를 보는 방법  기타 유용한 파일 

2011.08.12. 15:58

복사http://blog.naver.com/mktoolbox/70115865590

번역하기 전용뷰어 보기

PPAM 파일 소스를 보는 방법

 

1. 오피스 메뉴 PowerPoint 옵션에 보안센터 탭의 보안 센터 설정 단추를 누른 후

VBA 프로젝트 개체 모델에 안전하게 접근할 수 있음을 체크합니다.

 

2. Regedit 통해 HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\PowerPoint\Options 에

DebugAddins, DWORD, 1 추가합니다.

저렇게 하면 2007에서도 소스보기가 가능하네요...

 

1번 작업을 안하시면 2번작업한 후 PPT를 실행시키면 자동으로 DebugAddins 값이 0으로 변경됩니다.

그러니까 1번 작업부터 순서대로 하셔야 할 것 같습니다.

2003에서는 2번 작업만 해도 보이나보네요.


by 개발자가 되자! 2017. 2. 13. 20:55

C# AST Parser


Abstract Syntax Tree

한마디로 언어에 관계 없는 프로그래밍 언어의 형태를 나타내어 주는 간략한 트리라고 볼 수 있다.

위키


종류

-Cecil : C#의 IL코드를 분석하여 컴파일?하는 방식

-NRefactory : Cecil 오픈 라이브러리를 이용하여 AST 파서를 만들어 제공하는 것으로 요즘 내가 사용하고 있는 오픈소스 라이브러리임.


NRefactory

Github에서 소스파일이나 Library(Dll) 파일을 받을 수 있으며 사용하는 방법은 CodeProject의 예제에 나와있다. (NRefactory_Demo_and_IndexOf-Sample_-_Source)

Method 들의 호출관계(Call Hierarchy)를 구하고 싶어서 사용했으며 예시 코드는 다음과 같다.


이 프로젝트를 진행하면서 고생했던 것은

1. 오픈소스 라이브러리의 존재 유무

오픈소스 라이브러리가 있는 줄 몰랐기 때문에 처음에는 갖은 방법을 생각했었다.

처음 생각했던 것은 직접 Parser를 구현했지만 역시나 컴파일러 수준으로 작성하는 것은 효율적이지 못했고 어려웠다.

두번째로 생각했던 것은 정규표현식으로 함수모양으로 생긴 것들을 찾아내는 것이었으나 주석안에 있는 함수 등등 상당한 문제를 내포하고 있었다 (주석을 지우고 실행하는 것으로 해결)

마지막으로 찾은 것이 바로 AST Parser였다.

2. 오픈소스 라이브러리의 사용 방법

라이브러리마다 다른 사용법을 가지고 작성되었기 때문에 각각의 특성에 맞게 이용하는 것이 중요하다. 하지만 어떤 구성으로 되어있는지 처음에 사용하기도 어려웠기 때문에 Demo를 통해서 분석했다.

메소드는 어떤 타입으로 검사해야되는지(IMethod, MethodDeclaration) 등등 원하는 정보를 찾는 것도 어려웠다.

3. Find References

호출관계를 구하는 과정에서 시간이 오래걸렸다. 초기의 버전에서는 Method의 Call Hierarchy를 구할때마다 재귀적인 방식으로 FindReferences를 이용하여 구했는데 (해당 주소로 이동) 매번 호출하게 되니 거의 3분가량의 시간이 소모되었다. 개선하는 과정에서 Call Hierarchy를 Map으로 저장해두고 필요할때 타고 이동하는 방식을 사용해야겠다고 생각되었다.

4. Hash Collision

Method를 Hashtable에 넣어서 Call Hierarchy를 저장해두는 방식을 택하게 되었는데 어떤 문제인지 모르겠지만 계속 Hash값이 충돌되는 일이 발생되었다. 처음에는 GetHashCode에 문제가 있는 것 같아서 새로운 Hash값을 넣었지만 같은 충돌이 계속발생되었다. 같은 Method를 2번씩 넣기에 .cs이 중복되지 않았으며 Method는 계속 2번씩 호출되고 있었다. 그 이유는 interface를 피하고 class만을 구하는 방법이 잘못된 것이었다. 해결하기 위해 Method의 BodyRegion이 비어있는지 확인하는 것으로 해결했다.

5. Interface

Class의 method만을 가져오려고하는데 계속 Interface까지 가져오기에 함수가 두번씩 나오게 되었다. 이를 처리하기 위해서 Class를 먼저 구하고, 그 class 내부에서 method를 찾는 방식으로 진행했는데 partial class에서 method를 2번씩 가져오는 문제가 발생되었다.


여러가지 삽질끝에 NRefactory Parser를 잘 쓸 수 있게 됐다.

'프로그래밍 > C#' 카테고리의 다른 글

[Unity] Android Plugin  (0) 2015.09.29
[Error] ClickOnce error  (0) 2014.11.21
FTP with .NET (C#)  (0) 2014.10.21
by 개발자가 되자! 2015. 11. 3. 15:01

Regular Expression 들어가기에 앞서


1950년대 Stephen Kleene에 의해서 생각된 개념입니다.


텍스트들 중에서 내가 원하는 부분을 찾는 방법은 키워드로 검색하는 것이 일반적입니다.

키워드 검색의 정확성은 높지만 비슷한 정보들을 찾기는 어렵다는 단점이 있습니다.

이때 이용할 수 있는 방법이 바로 Regular Expression


예시를 들어보겠습니다.

게시판에서 글의 정보를 가져오는 쿼리의 ResultSet을 클래스에 담는 경우를 생각해봅니다.

TITLE, NAME

2개의 컬럼이 있는경우는 간단합니다.



SEQ, TITLE, NAME, DATE, UPDATE_DATE

5개의 컬럼이 있는 경우? 혹은 20개가 있는 경우는 일일이 작성해야 할까요?

위의 field 선언부를 보면 알 수 있지만 여러개를 모두 작성하려니 힘이 듭니다.

이럴때는 정규표현식을 이용하면 굉장히 편리합니다.




Regular Expression 시작하기

가장 많이 사용하는 정보를 위주로 설명드리겠습니다.

정규표현식 테스트사이트로 이동하셔서 테스트 해보시기 바랍니다.


1. meta sequences

어떠한 1글자를 나타내는 키워드

 .

 라인을 변경하는 문자를 제외한 다른 문자 1개

 Matches any character other than newline (or including newline with the /s flag) 

 \s

 공백, Tab, 라인변경

 Matches any space, tab or newline character.

 \S 

 \s를 제외한 나머지 문자

 Matches anything other than a space, tab or newline.

 \d

 숫자

 Matches any decimal digit. Equivalent to [0-9].

 \w

 문자, 숫자, 밑줄(_)

 Matches any letter, number or underscore.

 

 

 

 


2. quantifiers

수량을 나타내는 키워드


 ?

 0 ~ 1

 *

 0 ~ 무한 

 +

 1 ~ 무한 

 {숫자}

 정확히 숫자 갯수 

 {숫자,}

 숫자 갯수 이상 

 {숫자1, 숫자2}

 숫자1 ~ 숫자2 갯수 사이



3. group construct

어려우면서 잘쓰면 좋은 그룹!

...은 찾을 키워드 (다른 키워드들이 들어가거나 문자 숫자 들이 들어갑니다.)

그룹을 찾고 나면 찾은 순서대로 \1, \2, \3 이런식으로 사용이 가능합니다.


 ( ... ) 

 괄호 사이를 찾고 그룹으로 지정합니다.

 (\w)

 ( a | b )

 a 또는 b

 (a|b)

 (?: ... )

 괄호 사이를 찾지만 그룹으로 지정하지 않습니다

 

 (?<name> ... )

 괄호 사이를 찾고 그룹의 이름을 name으로 지정합니다

 

 앞...(?=뒤...)

 Positive lookahead

 앞을 찾되 뒤가 같은 결과만 찾습니다

 abc(?=def)

=> abcdef abc000

 앞...(?!뒤...)

 Negative lookahead

 앞을 찾되 뒤가 다른 결과만 찾습니다

 abc(?!def)

=> abcdef abc000

 앞...(?<=뒤...)

 Positive lookbehind

 뒤를 찾되 앞이 같은 경우만 찾습니다

 abc(?<=def)

=> abcdef 123def

 앞...(?<!뒤...)

 Negative lookbehind

 뒤를 찾되 앞이 다른 경우만 찾습니다

 abc(?<!def)

=> abcdef 123def

 

 

 

 

 

 




Regular Expression 적용하기


선언부를 이용하여 아래의 결과값을 만들도록 합니다.

원하는 결과값 입니다.

첫줄을 설명하면

int 라는 타입을 찾고 변수명인 SEQ를 찾아서 getter setter를 그대로 이용하도록 하는 코드입니다.


검색

1. 먼저 변수명을 찾으려면 어떻게 해야할지 생각해봅니다

; 문자 앞에 변수명이 오고 있습니다.

[정규표현식]  (\w+);

[설명] \w라는 문자 숫자 밑줄을 한개 / + 갯수(1~무한) / ; 라인이 끝남 / 괄호 (, ) 를 통해서 그룹 설정을 합니다


2. 사이사이에 공백문자가 들어갈 수 있음을 염두해둡니다

[정규표현식]  (\w+)\s*;

[설명] \s 공백문자/ * 갯수(0~무한)



3. 데이터 타입을 찾습니다

[정규표현식]  (\w+)\s+(\w+)\s*;

[설명] 공백이 1개 이상 있으며 그앞에 데이터 타입이 있습니다. / 괄호 (, ) 를 통해서 타입에 대한 그룹 설정을 합니다


4.앞 뒤의 모든 문자들을 포함합니다.

[정규표현식]  .*\s+(\w+)\s+(\w+)\s*;.*

[설명] 데이터 타입 앞에 1개의 공백을 띄우고 / .* 나머지 문자를 앞뒤로 모두 포함합니다.


5. 대소문자 구분을 위해 \w+를 \w{1}\w* 로 변경합니다

[정규표현식]  .*\s+(\w+)\s+(\w+)\s*;.*

[설명] 함수의 대소문자를 맞추기 위해 맨 앞자리를 구분합니다



변경

원하는 부분을 모두 검색했으며, 이젠 그룹을 통해 원하는대로 변경하는 작업이 남았습니다

현재의 그룹 상태

\1 에 들어있는 값 => 데이터 타입의 첫번째 문자

\2 에 들어있는 값 => 데이터 타입의 나머지 문자

\3 에 들어있는 값 => 변수명의 첫번째 문자

\4 에 들어있는 값 => 변수명의 나머지 문자


대문자로 출력하기가 설정되어야 합니다만 텍스트 에디터마다 다른 기능을 통해 지원하고 있습니다.

예를 들어 VIM, Notepad++ 은 \U를 통해 뒤에 나온 내용 전체 대문자화, \u를 통해 뒤에 나온 내용만 대문자화를 지원하고 있습니다. 소문자의 경우는 \L \l 입니다.


article.set\u\3\4\(resultSet\.get\u\1\2\("\3\4"\)\);

Notepad++을 기준으로 설명드리기 전에 먼저 regex101.com을 이용한 결과를 보여드리겠습니다

\u 키워드를 지원하지 않고 있기 때문에 그대로 u라고 출력되었습니다.


Notepad++을 통해 변경작업을 하게 되면 다음과 같습니다.


javascript를 이용하면 결과값에서 대문자화를 추가적으로 진행해야 합니다. stackoverflow 사이트로 이동

var re = /(\b[a-z](?!\s))/g;
var s = "fort collins, croton-on-hudson, harper's ferry, coeur d'alene, o'fallon"; 
s = s.replace(re, function(x){return x.toUpperCase();});
console.log(s); // "Fort Collins, Croton-On-Hudson, Harper's Ferry, Coeur D'Alene, O'Fallon"


이런식으로 Regex를 만들어두고 필요할 때 변경하여 사용하면 화살표 Ctrl+c, Ctrl+v 노가다를 줄일 수 있습니다!

댓글 피드백을 남겨주세요↓



by 개발자가 되자! 2015. 10. 22. 13:58

필요한 것들

- 안드로이드 개발환경, 유니티

안드로이드 스튜디오(기준으로 설명) 혹은 안드로이드를 개발가능한 이클립스






- 안드로이드 스튜디오를 이용하여 프로젝트를 생성한다

blank로 하던 Add No Activity로 하던 안에 있는거 다 삭제

res 안에 것들


- .java 파일을 하나 만든다

package stars.com.starsplugin;

AndroidManager.cs


Plugin.java



import android.util.Log;
import com.unity3d.player.UnityPlayer;

public class Plugin {
private static Plugin _plugin = null;
private Plugin() {

}
public static Plugin getInstance() {
if (_plugin == null) {
_plugin = new Plugin();
}
return _plugin;
}

public void CallAndroid(String msg)
{
Log.d("MYTEST", "CallAndroid");
String message = msg + "(by CallAndroid)";
UnityPlayer.UnitySendMessage("AndroidManager", "SetLog", message);
}
}

이대로라면 import가 되지 않았다며 빨간줄이 뜰 것이므로


- classes.jar 설정

 C:\Program Files\Unity\Editor\Data\PlaybackEngines\androidplayer\development\bin\classes.jar

복사

C:\Users\Administrator\AndroidStudioProjects\project\app\libs


Open Module Settings -> Dependencies -> File dependency -> libs/classes.jar 추가







- Gradle 설정

Gradle Scripts -> build.gradle(Module:app) 열기

아래와 같이 수정


apply plugin: 'com.android.library' // application -> library

android {
compileSdkVersion 22
buildToolsVersion "22.0.1"

defaultConfig {
// applicationId "com."
minSdkVersion 15
targetSdkVersion 22
// versionCode 1
// versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.1'
compile files('libs/classes.jar')
}

//task to delete the old jar
task deleteOldJar(type: Delete) {
delete 'release/AndroidPlugin.jar'
}

//task to export contents as jar
task exportJar(type: Copy) {
from('build/intermediates/bundles/release/')
into('release/')
include('classes.jar')
///Rename the jar
rename('classes.jar', 'AndroidPlugin.jar')
}

exportJar.dependsOn(deleteOldJar, build)

- Make Module App (Ctrl + Shift + F9) 를 실행한다


- 안드로이드 스튜디오의 오른쪽에 보면 Gradle Project가 있다.

Project -> :app -> Tasks -> other -> exportJar을 Run 한다.



- C:\Users\Administrator\AndroidStudioProjects\StarsPlugin\app\release 폴더에 가면

AndroidPlugin.jar 파일이 생긴다.

- UnityProject의 Assets\Plugins\Android 폴더로 옮긴다.




- 유니티 스크립트에서 


public void CallJavaFunc(string strFuncName, string strTemp)

{ using (AndroidJavaClass cls = new AndroidJavaClass("stars.com.starsplugin.Plugin")) {   using (AndroidJavaObject stars = cls.CallStatic<AndroidJavaObject>("getInstance"))

  {

    stars.Call(strFuncName, strTemp);

  }

} }

public void SetLog(string strJavaLog) { Debug.Log("message from java: " + strJavaLog); GameObject.Find("GameManager").GetComponent<debug>().strLog = strJavaLog; strLog = strJavaLog; }

- 유니티의 함수를 호출하기 위해 유니티에서 Empty Object를 생성하고




GameObject이름을 동일하게 해준다. UnityPlayer.UnitySendMessage("AndroidManager", "SetLog", message);

UnitySendMessage의 정의는 UnitySendMessage("GameObjectName1", "MethodName1", "Message to send");



함수가 있는 스크립트를 추가해줌





잘나온다




- 끗

무슨 NativePlayer니 어쩌니 그딴거 쓸일이 뭐가있나 삽질..


첨부파일 참고


참고 사이트 : http://answers.unity3d.com/questions/437708/jni-exception-using-android-plugin.html

http://docs.unity3d.com/Manual/PluginsForAndroid.html

http://blog.naver.com/bluefallsky/220110061131

gradle 파일 참고 : http://egloos.zum.com/dra784/v/11168585


'프로그래밍 > C#' 카테고리의 다른 글

[C# Parser] NRefactory  (0) 2015.11.03
[Error] ClickOnce error  (0) 2014.11.21
FTP with .NET (C#)  (0) 2014.10.21
by 개발자가 되자! 2015. 9. 29. 20:37

안드로이드 프로그래밍을 할때 꼭 필요한 것은 바로 디버그 메세지 확인이다.

물론 스마트폰의 디바이스 드라이버는 설치가 되어 있고, SDK가 설치 되어 있어야 한다.


1. ADB LOGCAT


cmd를 통해 아래의 adb를 실행하면 된다.

C:\Users\Administrator\AppData\Local\Android\sdk\platform-tools\adb.exe logcat 태그명:D *:S

C:\Users\Administrator\AppData\Local\Android\sdk\platform-tools\adb.exe logcat | find "찾을내용"


리눅스에서는 find 대신 grep을 이용하면 된다.


하지만 adb logcat을 이용하려면 CUI방식이기 때문에 불편함을 많이 느끼는데 이때 사용하면 좋은 것이 바로

DDMS!!! => Monitor로 업그레이드되었다.


2. Monitor (DDMS)


아래의 SDK 위치로 이동하여 monitor.bat를 실행한다.

C:\Users\Administrator\AppData\Local\Android\sdk\tools\monitor.bat



연결된 스마트폰의 로그도 볼 수 있고, 디바이스 위쪽 아이콘 중에서 스마트폰 3개가 겹쳐진 모양을 누르면 화면 캡쳐도 가능하다.


굳굳!

by 개발자가 되자! 2015. 7. 21. 23:08

이전에도 앞으로도 계속될 논쟁..

Call by Value와 Call by Reference에 대한 개념을 알고 있다고 가정하고 시작해봅니다.

소스코드의 일부는 http://egloos.zum.com/Dplex/v/4312931 여기서 가져왔습니다.


1. 기본자료형

일단 기본 자료형인 int ... 등의 값은 세가지 모두 Call by Value.


2. Class

2-1. Call by Value

C++의 예제

결과

0082B618:Jindo

003FFAA8:Max

003FFAA8:Fifi

003FFAA8:Rowlf

0082B618:Jindo


값을 복사해서 새로운 Class를 만들기 때문에 마지막 결과가 Jindo가 나옴을 알 수 있습니다.



2-2. Call by Address

설명하기에 앞서 Call by Address라는 단어를 알려드리고 싶어요

Call by Reference는 의미를 보자면 "함수내에서 변수값을 바꾸었더니 함수 밖에서도 값이 변한다." 는 겁니다.

call by value니 call by reference가 맞다느니... 왜 싸우는 걸까요? 


Java는 Call by Reference이라고 말하는 사람은 아래의 첫번째 정의를 보고 있기 때문이고

Call by Value 라고 하는 사람들은 두번째 정의로 보고 있기 때문입니다.


아래의 미묘한 차이점을 확인해주세요

- 변수 안에 저장되어 있던 주소값을 넘기는 것.

- 별명의 개념


쉽게 설명하면

첫번째 정의는 새로운 변수를 생성하여 저장되어있던 주소값 복사하여 담아두는 것을 말하고, 

두번째 정의는 해당 변수 자체의 주소라고 봅니다. 별명을 만든다고나 할까요, 다른 이름이지만 같은 변수를 가리키도록 말이에요.


첫번째 정의를 개념적으로 보았을때 주소값을 통해 Class를 접근하기 때문에 Call by Address 라고 말씀드리고 싶군요. 단어를 새롭게 정의!


Call by Address의 경우에는 아래의 설명을 참고하세요.

위의 사진처럼 함수에서 someDog이라는 주소값을 할당할 수 있는 공간이 생성되고 5000이라는 값이 복사 됩니다. 따라서 pointer 혹은 hash값이 다릅니다.


만약 함수 안에서 새로 인스턴스를 생성한다면 아래의 그림으로 바뀌게 됩니다.

변수 자체가 다르기 때문에 new Dog를 통해 새로운 인스턴스를 생성하게 되면 가리키는 메모리가 다르게 됩니다.


C++의 예제

결과

007BB618:Jindo

007BB618:Max

007BC990:Fifi

007BC990:Rowlf

007BB618:Max


Java의 예제

결과

Dog@659e0bfd : Jindo

Dog@659e0bfd : Max

Dog@2a139a55 : Fifi

Dog@2a139a55 : Rowlf

Dog@659e0bfd : Max


C#의 예제

결과

46104728 : Jindo

46104728 : Max

12289376 : Fifi

12289376 : Rowlf

46104728 : Max


2-3. Call by Reference는 아래의 설명을 참고하세요.

myDog라는 변수가 main 함수 안에 선언되어있으며 주소값은 1000입니다.

new Dog("Jindo");를 하게 되면서 5000이라는 메모리가 할당되고 name 변수에 "Jindo"의 주소값을 갖습니다.

C++의 경우에는 포인터를 통해 값을 넘기면 1000이라는 주소값을 넘깁니다.



만약 함수 안에서 새로 인스턴스를 생성한다면 아래의 그림으로 바뀌게 됩니다.

따라서 함수 안에서 값을 변경하게되면 main의 myDog값에 직접 쓰이게 되는 겁니다.


C++의 예제


결과

005CB618:Jindo

005CB618:Max

005CB618:Fifi

005CB618:Rowlf

005CB618:Rowlf


C#의 예제

결과

0076B618:Jindo
0076B618:Max
0076B618:Fifi
0076B618:Rowlf
0076B618:Rowlf



아래의 예제 결과로 글작성을 마칩니다!


Call by Value

Jindo

Max

Fifi

Rowlf

Jindo


Call by Address

Jindo

Max

Fifi

Rowlf

Max


Call by Reference

Jindo

Max

Fifi

Rowlf

Rowlf


이견이 있으신 분께서는 댓글을..

by 개발자가 되자! 2015. 4. 14. 17:11

처음에는 파일 입출력으로 사용하려고 하다가 수정해야하는 데이터가 많아짐에 따라 DB를 사용합니다


mySql, sqlite를 지원하기에 예전에 접해보았던 mysql로 결정


일단 간단하게 유저 정보를 입력받을 수 있도록 테이블을 생성합니다


CREATE TABLE `userinformation` (

  `idUserInformation` int(11) NOT NULL AUTO_INCREMENT,

  `nickname` varchar(32) DEFAULT NULL,

  `time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,

  `steamid` varchar(32) DEFAULT NULL,

  PRIMARY KEY (`idUserInformation`),

  UNIQUE KEY `name_UNIQUE` (`nickname`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;




와.. 점점 프로젝트가 커지는데요?






Version Information

-mysql workbench


-mysql

    mysql-5.6.23-winx64

by 개발자가 되자! 2015. 4. 5. 11:23

소스모드를 개발하기에 앞서 Notepad++ 셋팅을 하는 방법을 알아봅니다.




코딩을 하다보면 API를 찾아봐야 하는데 귀찮기 마련입니다.

Visual studio에서는 Ctrl + Space를 통해 자동완성과, Ctrl + Shift + Space를 통해 함수설명을 볼 수 있는데

Notepad++을 이용하면 sourcemod를 코딩할 때도 이 기능을 이용하실 수 있습니다.


1. Notepad++을 설치합니다.

Notepad++는 http://notepad-plus-plus.org/ 요기서 받으시면 됩니다.


2. sourcemod highlight를 다운받아 적용합니다.

http://hg.alliedmods.net/sourcemod-central/raw-file/tip/editor/npp/userDefineLang.xml

이 파일을 받아주시고 Notepad++을 열어줍니다.



상단 메뉴에서 Define your language...를 눌러주시고

(sourcemod는 과정을 진행하면 보입니다)



가져오기 버튼을 눌러서 userDefineLang.xml 파일을 열어주시고

Notepad++를 재시작해주세요.



3. API 적용

함수에 대한 설명을 보기위해 아래 과정을 진행합니다.


먼저 https://forums.alliedmods.net/showpost.php?p=1763531&postcount=124 여기에서 generator.sp 파일을 다운받습니다.


컴파일을 한뒤 generator.smx를 Left4Dead2\addons\sourcemod\plugins 에 넣어주시고


게임에서 콘솔을 열고 test 라고 작성합니다.


폴더에 보면 sourcemod.xml이라는 파일이 생성되는데 이 파일을 

C:\Program Files (x86)\Notepad++\plugins\APIs 여기로 넣어주세요



그리고 Notepad++을 재시작하게 되면 두둥!!




자동완성이 되는 것을 확인할 수 있습니다!



사용된 파일을 업로드합니다.

by 개발자가 되자! 2015. 4. 5. 10:32

안녕하세요

오늘은 pastebin.com의 무료로 텍스트를 저장하는 기능을 이용해서 간단한 인증을 구현해볼 예정입니다.

먼저 회원가입을 해야합니다.

http://pastebin.com 으로 이동합니다.


sign up 버튼을 누르시고



가입을 하고나면 이메일로 인증하라는 메일이 옵니다




이메일을 통해 위의 주소를 클릭하면 로그인이 됩니다.




저희가 사용하려고 하는 것은 무료로 인증을 하기를 원하는 것으로 FREE로 제공하는 기능을 이용할 예정입니다.

파일을 바로 올리거나 여러명이 로그인을 하지 못하며 1시간에 약 1개를 올릴 수 있습니다.


따라서 새로운 Paste를 만들기 보다는 기존의 Paste를 읽어와서 수정하는 것으로 작성합니다.



먼저 2가지의 API Key를 받아와야 합니다.

1번. Dev key

http://pastebin.com/api#1




2번. User key

http://pastebin.com/api/api_user_key.html





https://www.itsmods.com/forum/Thread-Tutorial-C-Upload-to-pastebin.html


WebClient client = new WebClient();

            Stream stream = client.OpenRead("http://pastebin.com/raw.php?i=WJB3qEvf");

            StreamReader reader = new StreamReader(stream);

            String content = reader.ReadToEnd();

            return content;


by 개발자가 되자! 2014. 12. 7. 03:20

Click Once를 통해 프로그램을 업데이트 했다.

프로젝트가 2010버전에서 Visual Studio 2013으로 바뀐 만큼 dll이 지원하는 버전이 달랐기에  .Net 4.0으로 업데이트를 해야만 했다.


ClickOnce로 Publish를 하고 잘돌아가는지 실행하는 순간


 Can not ... blah blah

  

 OK

 Detail



파일 서명이 일치하지 않아서 설치를 할 수 없다나..


Detail을 눌러보니


 Reference in the manifest does not match the identity of the downloaded assembly  ... .Interop.dll


여기저기 구글링해보아도 해결책이 없었다.


In project properties -> Application tab -> Resources -> checkbox Icon and manifest, the setting "Embed manifest with default settings" caused the problem. Setting it to "Create application without a manifest" fixes the problem.


Application의 Icon이 Embed manifest with default settings 때문에 문제가 발생한다는 글 뿐이었다.



문제를 해결한 방법은 이전에 사용하던 파일들 때문인 것 같았다.

Publish 폴더 전체를 날려버리고 다시 하니 성공!

'프로그래밍 > C#' 카테고리의 다른 글

[C# Parser] NRefactory  (0) 2015.11.03
[Unity] Android Plugin  (0) 2015.09.29
FTP with .NET (C#)  (0) 2014.10.21
by 개발자가 되자! 2014. 11. 21. 07:06
| 1 2 3 |