Bad Image Format Exception 입니다.이 문제는 32비트 Oracle 클라이언트 컴포넌트가 설치된 상태에서 64비트 모드로 실행 중일 때 발생합니다.
는, 내 에러, 에러에러로, 에러가 ..Net응용 프로그램이 Oracle 데이터베이스에 연결하려고 합니다.
는 「」라고 표시됩니다.This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed.하지만, 클라이언트에 의한 인스톨을 몇번이나 확인했습니다.x64 아니다32.
Date Time: 6/8/2014 10:57:55 AM: System.InvalidOperationException: Attempt to load Oracle client libraries threw BadImageFormatException. This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed. ---> System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
at System.Data.Common.UnsafeNativeMethods.OCILobCopy2(IntPtr svchp, IntPtr errhp, IntPtr dst_locp, IntPtr src_locp, UInt64 amount, UInt64 dst_offset, UInt64 src_offset)
at System.Data.OracleClient.OCI.DetermineClientVersion()
--- End of inner exception stack trace ---
at System.Data.OracleClient.OCI.DetermineClientVersion()
at System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(String userName, String password, String serverName, Boolean integratedSecurity, Boolean unicode, Boolean omitOracleConnectionName)
at System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionString connectionOptions)
at System.Data.OracleClient.OracleConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.OracleClient.OracleConnection.Open()
at CustomizedSetupInstaller.Runscripts.InitializeDBObjects(String connectionString, String dbProvider)
하나의 솔루션은 x86(32비트)과 x64 Oracle Client를 모두 머신에 설치하는 것입니다.어느 아키텍처에서 애플리케이션을 실행하든 상관없습니다.
x86 및 x64 Oracle 클라이언트를 하나의 머신에 설치하는 절차는 다음과 같습니다.
전제 조건:Oracle Home은 라고 불리며 클라이언트 버전은 11gR2입니다.
설치되어 있는 Oracle 클라이언트를 삭제합니다(「Oracle 11g(클라이언트)를 제거/완전 삭제하는 방법」을 참조하십시오.문제가 발생했을 경우)
x86 Client를 하여 Oracle x86 Client에 설치합니다.
C:\Oracle\11.2\Client_x86Oracle x64 Client를 다운로드하여 다른 폴더에 설치합니다(예:
C:\Oracle\11.2\Client_x64도구를 열고 합니다.
%WINDIR%\System32으로 (( )C:\Windows\System32링크를ora112★★★C:\Oracle\11.2\Client_x64해 주세요).더더 folder 로 변경
%WINDIR%\SysWOW64으로 (( )C:\Windows\SysWOW64링크를ora112★★★C:\Oracle\11.2\Client_x86(), (아래 참조)「 」를합니다.
PATH환경변수, 환경변수, 환경변수, 환경변수, 등의 모든 항목을 .C:\Oracle\11.2\Client_x86★★★★★★★★★★★★★★★★★」C:\Oracle\11.2\Client_x64타타에C:\Windows\System32\ora112의 「」, 「」, 「」의\bin주의: ★★★★★★★★★★★★★★★★★★★★★」C:\Windows\SysWOW64\ora112는 안 .에 따라서, 「」를 합니다.
ORACLE_HOME에서 ''로C:\Windows\System32\ora112이치노 값 " " " 를 설정합니다.
HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME로로 합니다.C:\Windows\System32\ora112값 " " " 를 설정합니다.
HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME로로 합니다.C:\Windows\System32\ora112)C:\Windows\SysWOW64\ora112)당신은 해냈어요!이제 x86과 x64 Oracle 클라이언트를 심리스하게 함께 사용할 수 있습니다.즉, x86 어플리케이션은 x86 라이브러리를 로드하고 x64 어플리케이션은 시스템에서 추가 수정 없이 x64 라이브러리를 로드합니다.
이 현명할 것입니다.
TNS_ADMIN안 돼, 안하다.TNS_ADMIN합니다.TNS_ADMIN=C:\Oracle\Common\network.
심볼릭 링크를 작성하기 위한 명령어:
cd C:\Windows\System32
mklink /d ora112 C:\Oracle\11.2\Client_x64
cd C:\Windows\SysWOW64
mklink /d ora112 C:\Oracle\11.2\Client_x86
주의:
두 심볼 링크는 동일한 이름을 가져야 합니다.ora112.
폴더 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」C:\Windows\System32 라이브러리가 만, 「x64」에는 「x64」가 포함되어 있습니다.C:\Windows\SysWOW64에는 x86(32비트) 라이브러리가 포함되어 있습니다.헷갈리지 마세요.
배경 정보, 작동 이유: 레지스트리 리다이렉터 및 파일 시스템 리다이렉터
Windows 10 PC에서도 같은 문제가 발생했습니다.이전 컴퓨터에서 새 컴퓨터로 프로젝트를 복사했습니다. 둘 다 64비트이고, 새 컴퓨터에 Oracle Client 64비트를 설치했습니다.같은 에러 메세지가 표시됩니다만, 많은 솔루션을 시험해 본 결과, 실제로 효과가 있던 것은 다음과 같습니다.Visual Studio (내 것은 2017년)에서 [툴]> [옵션]> [프로젝트와 솔루션]> [웹 프로젝트]를 선택합니다.
이 페이지에서 다음과 같은 옵션을 선택합니다.웹 사이트 및 프로젝트에 IIS Express 64비트 버전 사용
이 경우 64비트 Windows 2008 R2 OS에 Oracle 11.2 32비트 클라이언트가 설치되어 있었습니다.
솔루션:ASP에 할당된 응용 프로그램 풀의 상세 설정.NET 어플리케이션, 32비트 어플리케이션 사용을 True로 설정합니다.
Oracle 연결 기능을 테스트하기 위해 사용한 독립 실행형 .ashx 테스트 스크립트는 아래를 참조하십시오.응용 프로그램 풀을 변경하기 전에 다음과 같은 응답이 있었습니다.
[Running as 64-bit] Connection failed.
...어플리케이션 풀 변경 후:
[Running as 32-bit] Connection succeeded.
TestOracle.ashx – 시스템을 통한 Oracle Connection을 테스트하는 스크립트입니다.Data. Oracle Client:
사용 방법: 사용자, 비밀번호 및 호스트 변수를 적절하게 변경합니다.
이 스크립트는 ASP를 방해하지 않고 스탠드아론 방식으로 사용할 수 있습니다.NET 웹 응용 프로그램프로젝트 파일어플리케이션 폴더에 드롭하기만 하면 됩니다.
<%@ WebHandler Language="C#" Class="Handler1" %>
<%@ Assembly Name="System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" %>
using System;
using System.Data.OracleClient;
using System.Web;
public class Handler1 : IHttpHandler
{
private static readonly string m_User = "USER";
private static readonly string m_Password = "PASSWORD";
private static readonly string m_Host = "HOST";
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
string result = TestOracleConnection();
context.Response.Write(result);
}
public bool IsReusable
{
get { return false; }
}
private string TestOracleConnection()
{
string result = IntPtr.Size == 8 ?
"[Running as 64-bit]" : "[Running as 32-bit]";
try
{
string connString = String.Format(
"Data Source={0};Password={1};User ID={2};",
m_Host, m_User, m_Password);
OracleConnection oradb = new OracleConnection();
oradb.ConnectionString = connString;
oradb.Open();
oradb.Close();
result += " Connection succeeded.";
}
catch
{
result += " Connection failed.";
}
return result;
}
}
IIS를 수정하려면
- 응용 프로그램 풀을 선택합니다.
- ASP의 Clic.NET V4.0 클래식
- [상세설정]
- 일반적으로 32비트 응용 프로그램 사용 옵션에서 기본값은 false입니다.TRUE를 선택합니다.
- 사이트를 새로 고치고 확인합니다.
코멘트:
플랫폼: Windows Server 2008 R2 Enterprise - 64비트 - IIS 7.5
같은 문제가 발생하여 구성 매니저 x86 -> x64를 변경하여 수정하고 빌드합니다.

댓글에 지적된 바와 같이 시스템.Data.OracleClient는 더 이상 사용되지 않습니다.게임 중에 그렇게 늦게 사용할 이유가 거의 없습니다.
코멘트에서 지적된 바와 같이 (이것을 커뮤니티 Wiki로 표시하고 있습니다) odp.net 패키지의 12c 이후 버전에 관리 대상 프로바이더가 포함되어 있습니다.이 공급자는 관리대상 외 dll을 필요로 하지 않으므로 이 경우 문제가 되지 않습니다.
이전 관리되지 않는 오라클을 사용하려는 경우.Oracle의 DataAccess 프로바이더에서는 "DllPath" 구성 변수를 설정하는 것이 가장 간단한 솔루션입니다.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<oracle.dataaccess.client>
<add key="DllPath" value="C:\oracle\bin"/>
</oracle.dataaccess.client>
</configuration>
자세한 내용은 http://docs.oracle.com/database/121/ODPNT/InstallODP.htm의 "관리되지 않는 DLL 검색 순서"를 참조하십시오.
이 해결책은 나에게 효과가 있다.
IIS를 수정하려면
Select Application Pools.
Clic in ASP .NET V4.0 Classic.
Select Advanced Settings.
In General, option Enable 32-Bit Applications, default is false. Select TRUE.
Refresh and check site.
코멘트:
플랫폼: Windows Server 2012 Standart - 64비트 - IIS 8
SSIS 2008에서도 같은 문제가 있었습니다.ODAC 12c 32비트를 사용하여 Oracle 11g에 접속하려고 했습니다.ODAC 12c 64비트도 장착해 보았다.SSIS는 실제로 테이블을 미리 볼 수 있었지만 패키지를 실행하려고 하면 이 오류 메시지가 나타납니다.아무 도움도 없었다.VS 2013으로 전환하여 디버깅모드로 동작하고 있었는데dtexec /f 파일명을 사용하여 패키지를 실행했을 때 같은 에러가 발생하였습니다.그리고 이 페이지를 찾았습니다.http://sqlmag.com/comment/reply/17881
요약하면 다음과 같습니다. (페이지가 아직 남아 있다면 페이지로 이동하여 instrumentions...) 1) odac 64비트 xcopy의 최신 버전을 orac 사이트에서 다운로드하여 설치합니다.2) odac 32 bit xcopy의 최신 버전을 Oracle 사이트에서 다운로드하여 설치합니다.CMD 쉘 AS AN ADMIN STARTOR를 열고 install.bat oledb c:\odac\odac64를 실행하는 방법:첫 번째 파라미터는 설치할 컴포넌트입니다.두 번째 파라미터는 32 버전을 설치하는 장소입니다.c:\32bitODACLocation > install.bat oledb c:\odac\odac32. 3) c:\odac\odac32\bin; c:\odac\64\odac;c:c:\odac:bin을 포함하도록 시스템 경로를 변경합니다.5) odac32\admin\network 폴더와 odac64\admin\network 폴더에 동일한 tnsnames.ora가 있는지 확인합니다(또는 적어도 연결에는 같은 엔트리가 있는지 확인합니다).6) 이제 SSIS를 visual studio에서 엽니다(SSIS 패키지와 함께 2013 무료 버전을 사용). OLEDB를 사용한 다음 연결 유형으로 OLE DB 공급자용 오라클을 선택합니다.tnsnames.ora의 엔트리 이름을 "서버 또는 파일 이름"으로 설정합니다.사용자 이름은 스키마 이름(DB 이름)이고 암호는 스키마 암호입니다.당신은 해냈어요!
다시 말씀드리지만, 매우 상세한 솔루션 등은 원본 사이트에서 확인할 수 있습니다.
이것은 나에게 효과가 있고 환경을 망치지 않는 유일한 것이었다.
건배! gcr
C#.net을 사용하여 2.0 프레임워크와 함께 Oracle DB 접속을 위한 system.data.oracleclient를 사용하여 데스크톱 애플리케이션을 개발했는데 "Attempt to load Oracle client libraries through BadImageFormatException.이 문제는 32비트 Oracle 클라이언트 컴포넌트가 설치된 상태에서 64비트 모드로 실행 중일 때 발생합니다."
다음 솔루션이 적용되었습니다.
- 프로젝트, 속성, 빌드 탭, 플랫폼 타깃 선택: x86
- 프로젝트, 클린 빌드, 리빌드 솔루션
- Oracle 11G*32비트 클라이언트 설치
어플리케이션이 Win2012 R2 서버에 설치되어 있는32비트 및 Oracle 32비트 클라이언트로 설정되어 있기 때문에 동작합니다.
이 에러는, Windows 2012 R2 에 인스톨 되고 있는 DNN 어플리케이션에서 발생했습니다.32비트 dll과 Oracle만 사용합니다.DataAccess.dll x32는 동작하고 있었습니다.솔루션은 다음과 같습니다.
- 이전 Oracle Client \ ODAC를 제거합니다.
- Oracle 11 Client x32를 설치합니다.
- Oracle ODAC 12 x 64 를 인스톨 합니다.
- IIS 애플리케이션 풀(클래식 버전)에 "32비트 애플리케이션 활성화" = true 옵션이 있는지 확인합니다.
사용 중인 IIS App 풀에서 Enable32bit Application을 TRUE로 설정합니다.
BadImageFormatException은 32비트(x86) dll이 64비트 dll을 호출할 때 또는 그 반대로 발생합니다.엔트리 실행 파일에 AnyCPU를 사용하면 64비트 머신에서 실행되면 64비트로 실행되지만 32비트 dll을 호출하면 예외가 발생하므로 AnyCPU가 항상 정답은 아닙니다.
VB6(32비트(x86)의 오래된 컴포넌트와 인터페이스해야 하기 때문에 모든 것을 32비트(x86)로 빌드하는 경향이 있습니다.64비트 머신의 퍼포먼스는 AnyCPU의 신뢰성이 더 중요할 경우 향상될 수 있습니다.
모든 컴포넌트를 32비트(x86)로 빌드하는 것을 추천합니다만, 매우 부하가 높은 작업을 하고 있지 않는 한 큰 차이는 없을 것 같습니다.
apc에서 설명한 바와 같이 "32비트 dll이 64비트 dll을 호출할 때 또는 그 반대" 오류가 발생합니다.문제는 AnyCPU를 사용하여 빌드하고 64비트 환경에서 실행 중인 경우 응용 프로그램이 64비트로 실행된다는 것입니다.32비트 및 64비트에 대해 명시적으로 재구축할 수 없는 경우 corflags라는 Microsoft 유틸리티를 사용할 수 있습니다.기본적으로 실행 중인 프로그램의 exe에서 플래그를 수정하여 환경이 64비트인 경우에도 32비트로 실행되도록 지시할 수 있습니다.
사용 방법에 대한 자세한 내용은 여기를 참조하십시오.
나에게 효과가 있었던 해상도를 추가하고 싶다.셋업: Windows 2008 R2(64비트 OS) 상에서 실행되는 Oracle 11g 64비트
클라이언트는 x86 플랫폼 설정으로 컴파일된 .net Framework 3.5 애플리케이션(2.0부터 포트)입니다.
Bad Image Format Exception도 같은 문제가 있었습니다.64비트로 컴파일을 하면 예외가 사라지지만, 64비트로 동작하지 않는 32비트의 active 컴포넌트를 사용하고 있기 때문에 그것은 나에게 선택사항이 아니었다.
Oracle 웹사이트에서 Oracle Instant Client 11(xcopy할 수 있는 DLL 묶음)을 다운로드하고 응용 프로그램 파일 디렉토리에 파일을 복사하여 문제를 해결했습니다.http://www.oracle.com/technetwork/database/features/oci/instant-client-wp-131479.pdf 를 참조해 주세요.
이것으로 문제가 해결되었습니다.ProcMon 툴에서 로컬로 복사된oci.dll이 시스템에 의해 로드되는 것을 알 수 있습니다.Data.Oracle Client 등 모든 것이 정상입니다.
상기와 같이 환경설정을 변경하는 것으로, 이 방법은 서버 구성의 설정을 변경하지 않는 장점이 있습니다.
저는 콘솔 어플리케이션입니다(Windows 어플리케이션에서도 동작합니다).같은 문제가 있었습니다.이를 해결하기 위해 PlatformTarget을 시스템처럼 x64로 사용했습니다.Data.OracleClient.dll(64비트 파일)은 C:\Program Files(x86)\Reference Assemblys에 있습니다.\Microsoft\Framework.NETFramework\v4.5여기에는 명시적으로 64비트 버전의 Oracle Client가 사용됩니다.이 방법은 솔루션이 64비트에서만 작동하고 VB에서 만든 dll과 같은 32비트 dll을 사용하지 않는 경우에 도움이 될 수 있습니다.도움이 되길 바랍니다.
문제가 해결된 Oracle Client 11.2 32-Bit와 같은 올바른 버전의 Oracle Client를 다운로드하십시오.
또한 시스템이 64비트이고 오라클을 사용 중임을 확인했을 때와 같은 오류가 발생했습니다.32비트 버전의 Data Access를 올바른 64버전을 추가했는데, 이제 Oracle 참조 경로 아래에서 해결되었습니다.Data Access.dll
64비트 OS의 올바른 경로-C:\Oracle\11g_64\product\11.2.0\client_64\odp.net\bin\4\Oracle.DataAccess.dll
32비트 OS의 올바른 경로-C:\Oracle\11g_32\product\11.2.0\client_64\odp.net\bin\4\Oracle.DataAccess.dll
콘솔 어플리케이션에서 이 문제가 발생하였습니다.
방금 플랫폼 타깃을 "Any CPU"로 변경한 경우 솔루션을 오른쪽 클릭하여 속성을 클릭하면 탭 "Build"가 표시되고 "Platform Target:"이 "Any CPU"로 변경되어 문제가 해결됩니다.
레지스트리 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP를 확인합니다.NET\4.112.# DIIPath 키가 32비트 Oarcle 클라이언트 BIN 디렉토리를 가리키고 있습니다.예를 들어 DIPath 값은 C:\app\User_name\11.2.0\client_32bit\bin일 수 있습니다.
ssis 2008의 경우 이미지 아래에 있는 활성 32비트 실행(이 링크를 클릭)만 있습니다.
코드를 AnyCpu가 아닌 x86 모드로 빌드합니다.
언급URL : https://stackoverflow.com/questions/24104210/badimageformatexception-this-will-occur-when-running-in-64-bit-mode-with-the-32
'codememo' 카테고리의 다른 글
| 레일: 레일의 POST 422(처리 불가능한 엔티티)경로나 컨트롤러 때문인가요? (0) | 2023.02.12 |
|---|---|
| jsonb 필드의 PostgreSQL 이름 변경 특성 (0) | 2023.02.12 |
| 장애/오류 발생 시 JSON 서비스가 반환해야 할 항목 (0) | 2023.02.12 |
| Angularjs $state 새 탭의 링크 열기 (0) | 2023.02.12 |
| 플라스크 앱에서 다른 사이트로 GET 요청을 보내려면 어떻게 해야 하나요? (0) | 2023.02.12 |