성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
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'>ODP.NET 설치 없이 .NET 클라이언트 프로그램 배포하는 방법</div><br /> <br /> 지난 이야기에서, 닷넷 응용 프로그램에서 Oracle에 접속하는 방법을 알아봤습니다.<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;' > .NET 응용 프로그램에서 Oracle XE 사용 ; <a target='_tab' href='http://www.sysnet.pe.kr/2/0/821'>http://www.sysnet.pe.kr/2/0/821</a> </pre> <br /> 그런데, 글을 읽어보신 분들은 실망하시겠지만 ODP.NET을 Xcopy 버전으로 다운로드 받았는데도 불구하고 install.bat 파일을 실행해줘야 했고 PATH 환경변수에 등록하는 작업을 했었습니다.<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;' > Using the new ODP.Net to access Oracle from C# with simple deployment ; <a target='_tab' href='http://splinter.com.au/blog/?p=156'>http://splinter.com.au/blog/?p=156</a> </pre> <br /> 위의 글은 약간 오래된 것 같은데, "Oracle 11g ODAC 11.1.0.7.20 with Xcopy Deployment" 버전으로 정리해 보면 다음의 DLL들이 EXE 파일과 같은 폴더에 복사되어 있으면 정상 동작합니다.<br /> <br /> <ul> <li>oci.dll (E:\oracle2\odpnet20)</li> <li>ociw32.dll (E:\oracle2\odpnet20)</li> <li>oraociei11.dll (E:\oracle2\odpnet20)</li> <li>OraOps11w.dll (E:\oracle2\odpnet20\bin)</li> <li>Oracle.DataAccess.dll (E:\oracle2\odpnet20\odp.net\bin\2.x)</li> </ul> <br /> 약간 황당한 면이 있다면, "oraociei11.dll" 파일의 크기가 104MB나 된다는! ^^;<br /> <br /> 그래서, 만약 ODP.NET을 사용한 응용 프로그램을 배포한다면 다음과 같이 파일들이 구성되어 있어야 클라이언트 측에 ODP.NET을 설치하는 작업없이도 응용 프로그램이 정상적으로 실행됩니다.<br /> <br /> [그림 1: ODP.NET 설치 없이 실행되는 응용 프로그램 배포]<br /> <img alt='how_to_deploy_odpnet_1.png' src='/SysWebRes/bbs/how_to_deploy_odpnet_1.png' /><br /> <br /> <hr style='width: 50%' /><br /> <br /> 그런데, 의존성 문제가 하나 더 있습니다. 테스트하면서 알게 되었는데, 특정 컴퓨터에서는 다음과 같이 예외가 발생하였습니다. <br /> <br /> <SPAN style='BACKGROUND-COLOR: #ccffcc; FONT-STYLE: italic; MARGIN: 10px 0px 10px 10px; WIDTH: 800px; FONT-FAMILY: 맑은 고딕, Consolas, Verdana; COLOR: #005555'><br /> C:\...>ConsoleApplication2.exe<br /> <br /> <b style='COLOR: blue'>Unhandled Exception: System.TypeInitializationException: The type initializer for 'Oracle.DataAccess.Client.OracleConnection' threw an exception. ---> Oracle.DataAccess.Client.OracleException The provider is not compatible with the version of Oracle client </b> <br /> at Oracle.DataAccess.Client.OracleInit.Initialize()<br /> at Oracle.DataAccess.Client.OracleConnection..cctor()<br /> --- End of inner exception stack trace ---<br /> at Oracle.DataAccess.Client.OracleConnection..ctor(String connectionString)<br /> at ConsoleApplication2.Program.Main(String[] args)<br /> </span><br /><br /> <br /> 혹시나 싶어, Depends.exe로 살펴보니 oci.dll, ociw32.dll, oraociei11.dll들이 모두 msvcr71.dll에 종속성을 가지고 있었습니다. 즉, 예외가 발생한 컴퓨터에서는 msvcr71.dll이 없었기 때문에 그와 같은 오류가 발생했다는 것이고.<br /> <br /> 정리해 보면, ODP.NET을 설치 과정없이 "대부분의" 클라이언트 측 컴퓨터에서 곧바로 실행하기를 원한다면 EXE 파일이 놓인 곳에 다음과 같이 6가지의 DLL들이 존재해야 합니다.<br /> <br /> <ul> <li>Oracle.DataAccess.dll</li> <li>OraOps11w.dll</li> <li>oci.dll</li> <li>ociw32.dll</li> <li>oraociei11.dll</li> <li>msvcr71.dll</li> </ul> <br /> <hr style='width: 50%' /><br /> <br /> <a target='_tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=505&boardid=331301885'>첨부한 프로젝트</a>에는 "<a target='_tab' href='/2/0/821'>.NET 응용 프로그램에서 Oracle XE 사용</a>" 글에서 사용된 예제 코드를 포함하고 있습니다. 또한 위와 같은 설정이 반영되었으므로 Oracle XE가 설치된 원격(또는 로컬)PC가 구성된 환경이라면 곧바로 테스트 해볼 수가 있습니다. "...[압축해제폴더]...\ConsoleApplication2\bin\Debug" 폴더의 "ConsoleApplication2.exe.config" 파일을 열면 다음과 같이 구성되어 있는데,<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;' > <?xml version="1.0"?> <configuration> <configSections> ... [생략] ... </configSections> <startup> <supportedRuntime version="v2.0.50727"/></startup> <applicationSettings> <ConsoleApplication2.Properties.Settings> <setting name="ConnectionString" serializeAs="String"> <value><b style='COLOR: blue'>user id=hr;password=hr; data source=svrname</b></value> </setting> </ConsoleApplication2.Properties.Settings> </applicationSettings> </configuration> </pre> <br /> 연결 문자열 부분만 적절하게 자신의 환경에 맞게 설정해 주고 "ConsoleApplication2.exe" 파일을 실행해 주면 정상적으로 화면에 "Administration"이라는 문자열이 출력될 것입니다.<br /> <br /> 참고로, "oraociei11.dll" 파일이 100MB가 넘기 때문에 첨부 파일을 2개로 나눴습니다.<br /> <br /> <ul> <li><a target='_tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=505&boardid=331301885'>ConsoleApplication2.zip</a>: 모든 파일을 가지고 있는 압축 파일</li> <li><a target='_tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=506&boardid=331301885'>ConsoleApplication2_no_oraociei11.zip</a>: oraociei11.dll 파일을 뺀 압축 파일</li> </ul> <br /> <br /> <br /><br /><hr /><span style='color: Maroon'>[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
9398
(왼쪽의 숫자를 입력해야 합니다.)