성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <div style='font-family: 맑은 고딕, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>IIS Express - "IIS Installed Versions Manager Interface"의 IIISExpressProcessUtility 구하는 방법</div> <br /> IIS Express 관련해서 제어 방법을 찾아보니 다음의 글이 나왔습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > Starting and stopping IIS Express programmatically ; <a target='_tab' href='http://stackoverflow.com/questions/4772092/starting-and-stopping-iis-express-programmatically'>http://stackoverflow.com/questions/4772092/starting-and-stopping-iis-express-programmatically</a> </pre> <br /> 위의 글에서 질문한 사람은 "Version Manager API"를 "this purpose I want to use the official 'IIS Express API' which is documented on MSDN"이라고 하면서 '공식적인 방법'이라고 생각하고 있습니다. 하지만, 실제로 MSDN에서 보니 그렇지는 않더군요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > Version Manager API (IIS Express) ; <a target='_tab' href='https://learn.microsoft.com/en-us/iis/extensions/express-api-reference/version-manager-api-iis-express'>https://learn.microsoft.com/en-us/iis/extensions/express-api-reference/version-manager-api-iis-express</a> </pre> <br /> 분명히 다음과 같이 말하고 있습니다.<br /> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: 맑은 고딕, Consolas, Verdana; COLOR: #005555'> Note:<br /> The IIS Version Manager API supports the IIS Express infrastructure and <b style='COLOR: blue'>is not intended to be used directly from your code.</b><br /> </div><br /> <br /> 그래도 제어 방법이 그 이외에는 없는 한, 문서에서야 어찌되었건 MSDN에 나왔다는 것만으로 일단은 충분히 '공식적'이라고 여길 수밖에 없을 것 같습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 코딩을 해서 직접 구해 볼까요?<br /> <br /> 우선, C# 프로젝트에서 '참조 추가'를 통해 "IIS Installed Versions Manager Interface"를 추가합니다.<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='how_to_use_iisexpress_com_api_1.png' src='/SysWebRes/bbs/how_to_use_iisexpress_com_api_1.png' /><br /> <br /> 그런데, "new IISVersionManagerLibrary."까지 해서 인텔리센스 창을 열어보자마자 실망하게 될 것입니다.<br /> <br /> <img border='1' alt='how_to_use_iisexpress_com_api_3.png' src='/SysWebRes/bbs/how_to_use_iisexpress_com_api_3.png' /><br /> <br /> 왜냐하면, 인스턴스화 할 수 있는 것이 단지 "IISVersionManagerClass"밖에는 없기 때문입니다. IISExpressProcessUtility를 인스턴스화 할 수 있는 방법이 위에서는 제공되지 않습니다.<br /> <br /> 그나마 IISVersionManagerClass에서 제공되는 메서드 정보를 보면 다음과 같습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > [Guid("9CDA0717-2EB5-42B3-B5B0-16F4941B2029")] [InterfaceType(1)] public interface IIISVersionManager { <b style='COLOR: blue'>Array</b> GetAllVersionObjects(); <b style='COLOR: blue'>IIISVersion</b> GetVersionObject(string bstrVersion, IIS_PRODUCT_TYPE dwProductType); } </pre> <br /> 그래도, 아주 희망이 없는 것은 아닌 것 같습니다. IIISVersion을 구할 수 있는 거 보면, 일단은 다음과 같이 시작해 볼 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > IISVersionManagerLibrary.IIISVersion ver = mgr.GetVersionObject("7.5", IISVersionManagerLibrary.IIS_PRODUCT_TYPE.IIS_PRODUCT_EXPRESS); </pre> <br /> IIISVersion 구조를 살펴 보니, <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > [Guid("1B036F99-B240-4116-A6A0-B54EC5B2438E")] [InterfaceType(1)] public interface IIISVersion { void ApplyIISEnvironmentVariables(); void ApplyManifestContext(); void ClearIISEnvironmentVariables(); void ClearManifestContext(); <b style='COLOR: blue'>object CreateObjectFromCLSID(Guid clsidObject);</b> <b style='COLOR: blue'>object CreateObjectFromProgId(string bstrObjectName);</b> <b style='COLOR: blue'>object GetPropertyValue(string bstrName);</b> } </pre> <br /> IIISExpressProcessUtility를 구할 수 있는 메서드는 대략 다음과 같이 좁혀 듭니다.<br /> <br /> <ul> <li>CreateObjectFromCLSID</li> <li>CreateObjectFromProgId</li> <li>GetPropertyValue</li> </ul> <br /> 헌데, COM 공부를 하신 분이라면 눈치채셨겠지만, IIISExpressProcessUtility 인터페이스는 ClassFactory가 없는 경우이므로 CLSID와 ProgId로부터는 개체를 생성할 수 없습니다. 이로써 남은 것은 GetPropertyValue 메서드인데, 문제는 수많은 문자열 중에 과연 어떤 것을 인자로 전달해야 우리가 원하는 것을 얻을 수 있냐는 것입니다.<br /> <br /> 역시 도움말을 찾아봐야겠지요. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > GetPropertyValue ; <a target='_tab' href='https://learn.microsoft.com/en-us/iis/extensions/express-api-reference/getpropertyvalue'>https://learn.microsoft.com/en-us/iis/extensions/express-api-reference/getpropertyvalue</a> </pre> <br /> 위의 도움말에 보면, 다음과 같은 희망적인 문구가 나옵니다.<br /> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: 맑은 고딕, Consolas, Verdana; COLOR: #005555'> The set of valid property names can be obtained by calling the function with the name <b style='COLOR: blue'>availableReadableProperties</b> as the bstrName parameter, which returns a comma-delimited BSTR<br /> </div><br /> <br /> 이에 따라 실행해 보면,<br /> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: 맑은 고딕, Consolas, Verdana; COLOR: #005555'> object obj = ver.GetPropertyValue("<b style='COLOR: blue'>availableReadableProperties</b>");<br /> Console.WriteLine(obj);<br /> <br /> // 출력 결과<br /> <br /> "version,productType,installPath,defaultConfigurationPath,defaultSchemaPath,manifestFile,userInstanceHelper,expressProcessHelper"<br /> </div><br /> <br /> 자, 이제 다시 감각을 따라야 할 시간입니다. 아무래도 가능성이 있어 보이는 것은 "expressProcessHelper" 같습니다. <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > object obj1 = ver.GetPropertyValue("<b style='COLOR: blue'>expressProcessHelper</b>"); IISVersionManagerLibrary.IIISExpressProcessUtility util = <b style='COLOR: blue'>obj1 as IISVersionManagerLibrary.IIISExpressProcessUtility;</b> </pre> <br /> 과연 결과는? null이 아닙니다. 성공!<br /> <br /> <hr style='width: 50%' /><br /> <br /> 알아본 김에, userInstanceHelper 값이 어떤 인터페이스와 연관되었는지 결과를 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > object obj2 = ver.GetPropertyValue("<b style='COLOR: blue'>userInstanceHelper</b>"); IISVersionManagerLibrary.IIISUserData user = <b style='COLOR: blue'>obj2 as IISVersionManagerLibrary.IIISUserData</b>; </pre> <br /> 역시 user 변수 값은 null이 아닙니다. 이로써, Version Manager API 문서에 기록된 IIISVersionManager, IIISVersion, IIISUserData, IIISExpressProcessUtility 총 4개의 인터페이스를 구하는 방법을 알아봤습니다.<br /> <br /> 일단은 마이크로소프트의 공식 문서 상으로 위와 같은 사용 설명서를 포함하고 있지 않지만 언젠가는 업데이트가 될 것입니다. 이 글은 그 때까지 유효하겠고. ^^<br /> <br /> (<a target='_tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=590&boardid=331301885'>첨부된 문서는 위의 예제 코드</a>를 담고 있습니다.)<br /> <br /><br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
6622
(왼쪽의 숫자를 입력해야 합니다.)