ローカル、開発サーバー、および運用サーバーで動作するプロジェクトがあります。
テストサーバーで実行しようとすると、以下のエラーが表示されます。画面をじっと見つめる以外に、どうすればよいかわかりません。ヒント?問題をその原因まで追跡するプロセス?
Oracle 12.2などのNuGetパッケージをインストールしました。
アセンブリ 'Oracle.ManagedDataAccess、Version = 4.121.2.0、Culture = neutral、PublicKeyToken = 89b483f429c47342'からタイプ 'OracleInternal.Common.ConfigBaseClass'をロードできませんでした。説明:現在のWeb要求の実行中に未処理の例外が発生しました。エラーの詳細およびコードのどこで発生したかについては、スタックトレースを確認してください。
例外の詳細:System.TypeLoadException:アセンブリ「Oracle.ManagedDataAccess、Version = 4.121.2.0、Culture = neutral、PublicKeyToken = 89b483f429c47342」からタイプ「OracleInternal.Common.ConfigBaseClass」をロードできませんでした。
ソースエラー:
現在のWeb要求の実行中に、未処理の例外が生成されました。例外の発生源と場所に関する情報は、以下の例外スタックトレースを使用して特定できます。
スタックトレース:
[TypeLoadException:アセンブリ 'Oracle.ManagedDataAccess、Version = 4.121.2.0、Culture = neutral、PublicKeyToken = 89b483f429c47342'からタイプ 'OracleInternal.Common.ConfigBaseClass'をロードできませんでした。]
Oracle.ManagedDataAccess.EntityFramework.EntityFrameworkProviderSettings.Oracle.ManagedDataAccess.EntityFramework.EFProviderSettings.IEFProviderSettings.get_TracingEnabled()+0 Oracle.ManagedDataAccess.EntityFramework.EFProviderSettings.InitializeProviderSettings()+111 Oracle.ManagedDataAccess.EntityFramework.EFOracleProviders。 ctor()+629 Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices..cctor()+28[TypeInitializationException: 'Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices'の型初期化子が例外をスローしました。]
Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices.get_Instance()+24
Web.Configには、次のブロックが含まれています。
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.Microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<section name="Oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</configSections>
そして
<Oracle.manageddataaccess.client>
<version number="*">
<dataSources>
<dataSource alias="PVMDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=pdxcludds108.pacificorp.us)(PORT=11086))(CONNECT_DATA=(SERVICE_NAME=DDS1086.PACIFICORP.US))) " />
</dataSources>
</version>
</Oracle.manageddataaccess.client>
<connectionStrings>
<add name="OracleDbContext" providerName="Oracle.ManagedDataAccess.Client" connectionString="User Id=USERID;Password=WORKINGPASSWORD;Data Source=PVMDataSource" />
<add name="PVMEntities" connectionString="metadata=res://*/Models.PVMModel.csdl|res://*/Models.PVMModel.ssdl|res://*/Models.PVMModel.msl;provider=Oracle.ManagedDataAccess.Client;provider connection string="DATA SOURCE=pdxcludds108.pacificorp.us:11086/DDS1086.PACIFICORP.US;PASSWORD=XXXXXXX;PERSIST SECURITY INFO=True;USER ID=XXX"" providerName="System.Data.EntityClient" />
</connectionStrings>
注:このサーバーで動作するプロジェクトは他にもあります。それらは、.Net用のOracleクライアントの異なるバージョンを使用しているだけです。他のどれもManagedドライバーのみを使用していません。私はこのエラーを掘り下げる方法、そのタイプのソースおよびロード元に関するヒントを探しています。
NuGetのOracle.ManagedDataAccess
と(Oracleクライアントのインストールによって)サーバーにインストールされ、GACに登録されているものとの間に競合があります。
GACからOracle.ManagedDataAccess
の登録を解除すると、エラーがなくなります。コマンドラインを実行して、ディレクトリに移動します。
{Oracleホーム}\product\{version}\client_64\ODP.NET\managed\x64
そこにOraProvCfg.exe
ファイルがあります。次のコマンドを実行して、GACからOracle.ManagedDataAccess
の登録を解除します。
OraProvCfg /action:ungac /providerPath:Oracle.ManagedDataAccess
removeでOracle.ManagedDataAccessアセンブリを[〜#〜] gac [〜#〜](C:\ Windows\Microsoft.NET\Assembly ...)
コマンドツール
gacutil
を使用して、アセンブリを削除します。C:\ Program Files(x86)\ Microsoft SDKs\Windows\YOUR_VERSION\bin\NETFX 4.6.1 Tools> gacutil/u Oracle.ManagedDataAccess
プロジェクト内の参照を、パッケージマネージャーによってインストールされたものからOracleクライアントインストーラーによってインストールされたものにOracle.ManagedDataAccessおよびOracle.ManagedDataAccess.EntityFrameworkに置き換えることで修正できました。バージョンは同じですが、ビルド番号はこれらのDLLで異なります
他の人が言ったように、GACからOracle.ManagedDataAccessを削除する必要があります。
走る {Oracle home}\product\12.1.0\dbhome_1\ODP.NET\managed\x64\unconfigure.bat
および{Oracle home}\product\12.1.0\dbhome_1\ODP.NET\managed\x836\unconfigure.bat
そしてそれは働いた
GACからDLLを削除することはオプションではない場合、次のバージョンのOracle.managedData.access 12.2.1を取得し、それらを単にbinディレクトリ内のサーバーに配置することを検討してください。 web.configファイルにassemblyBindingを追加します。
このようにして、エラーが発生するランタイム中にGACから12.1.2バージョンをプルすることになります。新しいバージョンに対してアプリを再コンパイルする必要はありません。
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-12.1.2.0" newVersion="12.2.1.0" />
</dependentAssembly>
この問題には間違いなく奇妙なことがあります。ローカルサーバーでアプリを開発していましたが、正常に動作しましたが、サーバーにアプリをアップロードするとこのエラーが発生しました。サーバーにOracleクライアントがインストールされています。このスレッドを見た後、2つのDLL(Oracle.ManagedDataAccess.dll
&Oracle.ManagedDataAccess.EntityFramework.dll
)Oracleクライアント内から、app binディレクトリのバージョンを置き換えました。これで問題が修正されました。
私のシナリオでは、クラスライブラリデータベースユーティリティを使用するコンソールアプリケーションがあります。コンソールアプリケーションでもOracle.ManagedDataAccessを参照する必要があったため、ランタイムでdllを見つけることができました。これが最善のアプローチであるかどうかはわかりませんが、私のために働いた。