アセンブリのマニフェスト定義はアセンブリ参照に 一致 しま せん oracle

.net

【.net】Oracle.DataAccessの例外と原因まとめ

ODP.Net経由でOracleに接続する場合のエラー対処法まとめです。
過去に幾度となく苦しめられてきたのでメモ。

事象①

System.TypeInitializationException: 
'Oracle.DataAccess.Client.OracleCommand' のタイプ初期化子が例外をスローしました。 
---> Oracle.DataAccess.Client.OracleException: プロバイダは、このバージョンのOracleクライアントと互換性がありません

原因

クライアントにインストールしているOracle.DataAccess.dllと、参照しているOracle.DataAccess.dllのバージョンが異なる。
※いけるバージョン違いもある

発生例

インストールバージョン:4.121.2.0
参照バージョン:4.122.1.0

事象②

System.IO.FileNotFoundException: 
ファイルまたはアセンブリ名 'Oracle.DataAccess'、またはその依存関係の1つが読み込めませんでした。指定されたファイルが見つかりません。
(Could not load file or assembly 'Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342' or one of its dependencies. The system cannot find the file specified.)

原因

アプリケーションがOracle.DataAccess.dllを見つけれない状態。気をつけなければならないのが、単純にdll同梱漏れ&未インストールの他に、異なるプラットフォーム(x86, x64)版のODACをインストールした場合も対象となること。

発生例

64bitOSで、32bit版のODACをインストールしており、AnyCPUやx64でビルドされたアプリケーションで実行する。

事象③

System.BadImageFormatException: 
ファイルまたはアセンブリ名 'Oracle.DataAccess'、またはその依存関係の1つが読み込めませんでした。間違ったフォーマットのプログラムを読み込もうとしました。
(Could not load file or assembly 'Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342' or one of its dependencies. An attempt was made to load a program with an incorrect format.)
File name: 'Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342'

原因

ターゲットCPUと、動作環境のOSビット数と異なる。事象②と違い、アプリケーションはOracle.DataAccess.dllを見つけられている。

発生例

x86でビルドしたが、64ビットOSで動かしている。

事象④

System.TypeInitializationException: ‘Oracle.DataAccess.Client.OracleConnection’ のタイプ初期化子が例外をスローしました。
—> System.DllNotFoundException: DLL ‘OraOps12.dll’ を読み込めません:指定されたモジュールが見つかりません。 (HRESULT からの例外:0x8007007E)
場所 Oracle.DataAccess.Client.OpsInit.CheckVersionCompatibility(String version)
場所 Oracle.DataAccess.Client.OracleInit.Initialize()
場所 Oracle.DataAccess.Client.OracleConnection..cctor()

原因

OracleConnection生成時に上記の例外が発生する。OraOpsXX.dllは、Oracle.DataAccess.dllから内部的に呼ばれるdll。要するにOracle.DataAccess.dllはあるが、OraOpsXX.dllが見つからない状態。

発生例

Oracleクライアントをインストールしていない。

 

2020/10/8 技術系memo

ASP.NET(MVC5)で作成したアプリを変更してデプロイした。デプロイ後、Invoke-WebRequestでアクセスしたところ、アプリケーションエラーが発生した。エラー内容は下記。

Invoke-WebRequest : '/API' アプリケーションでサーバー エラーが発生しました。
ファイルまたはアセンブリ 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicK
eyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はア
センブリ参照に一致しません。 (HRESULT からの例外:0x80131040)
説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所について
は、スタック トレースを参照してください。
例外の詳細: System.IO.FileLoadException: ファイルまたはアセンブリ 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform,
Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。見
つかったアセンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)
ソース エラー:
現在の Web 要求の実行中にハンドルされていない例外が生成されました。障害の原因および発生場所に関する情報については、下の
例外スタック トレースを使って確認できます。
アセンブリ読み込みトレース: 以下の情報は、アセンブリ 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1
.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' を読み込めなかった原因を調べるのに役立ちます。
警告: アセンブリ バインドのログ記録がオフにされています。
アセンブリ バインドのエラー ログを有効にするには、レジストリ値 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) を 1
に設定してください。
注意: アセンブリ バインドのエラー ログに関連するパフォーマンス ペナルティがあります。
この機能をオフにするには、レジストリ値 [HKLM\Software\Microsoft\Fusion!EnableLog] を削除します。
スタック トレース:
[FileLoadException: ファイルまたはアセンブリ 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Cult
ure=neutral, PublicKeyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリの
マニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)]
   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) +96
   System.Type.GetType(String typeName) +62
   System.CodeDom.Compiler.CompilerInfo.get_IsCodeDomProviderTypeValid() +15
   System.Web.Compilation.CompilationUtil.GetRecompilationHash(CompilationSection ps) +2406
   System.Web.Configuration.CompilationSection.get_RecompilationHash() +110
   System.Web.Compilation.BuildManager.CheckTopLevelFilesUpToDateInternal(Int64 cachedHash) +551
   System.Web.Compilation.BuildManager.CheckTopLevelFilesUpToDate(Int64 cachedHash) +59
   System.Web.Compilation.BuildManager.ExecutePreAppStart() +155
   System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMap
PathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception ap
pDomainCreationException) +746
[HttpException (0x80004005): ファイルまたはアセンブリ 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.
1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセ
ンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +552
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +122
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +737
バージョン情報: Microsoft .NET Framework バージョン:4.0.30319; ASP.NET バージョン:4.8.4075.0
発生場所 行:1 文字:1
+ Invoke-WebRequest http://xxxx:8080/api/xxxxCopy/
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest]、WebExce
    ption
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

Visual Studioで開発してテストしていると何も問題がなかった。原因は、Web.configをデプロイしていなかったこと。Visual Studioの環境や.Net Framework 4.8の環境は、毎月更新されていく。その環境でコンパイルしたときに、もともとのWeb.configに記載された情報と新しくコンパイルされたものの情報が異なった。そのために、実行時にエラーになった。解決策としては、新しくコンパイルした方のWeb.configを使うこと。環境に合わせて変更する必要があれば変更する。