System.Data.sqlite and Subsonic 3:VS2008ではうまく機能しますが、VS2010では機能しません
-
28-10-2019 - |
質問
昨年、私はVS2008プロジェクトでSubsonic 3とSQLiteを非常に成功裏に使用し、結果に非常に満足していました。つい最近、私はVS2010プロジェクトでSubsonic 3とSQLiteをセットアップしようとしましたが、新しいSimplerePositoryをインスタンス化しようとすると、内的例外に会いました。
'System.data.sqlite.sqliteFactory'のタイプ初期イザーは例外を投げました
私が夢中にならないようにするために、私はVS2008でまったく同じコードとapp.configファイルを試しましたが、問題ありません。変!
現在、私はSystem.data.sqlite 1.0.73.0(3.7.6.3)のsubsonic 3.0.0.4とx64バージョンのx64バージョンを使用しています(32ビットバージョンも試しましたが)。両方のDLLを参照とセットとして追加しました。ローカルをコピーしてtrueに。
私のapp.configは次のように見えます:
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite" />
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite"
type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
</DbProviderFactories>
</system.data>
<connectionStrings>
<add name="myDatabase" connectionString="Data Source=C:\DB\mydatabase.db3" providerName="System.Data.SQLite"/>
</connectionStrings>
そして私のコードは次のように見えます:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SubSonic.Repository;
namespace SubSonicSqliteTestConsole
{
class Program
{
static void Main(string[] args)
{
var repo = new SimpleRepository("myDatabase", SimpleRepositoryOptions.RunMigrations);
}
}
}
何か案は?
解決
Visual Studio 2010とSQLite 1.0.66でSubsonic 3を使用しています。しかし、あなたがしなければならないことがいくつかあります:
- アプリケーションはx86(anycpuではない)でなければならないか、64ビットマシンでbadimageformatexceptionを取得します
- ターゲットフレームワークを「フレームワーク4.0クライアントプロファイル」から「フレームワーク4.0」に変更する必要があります。
これをapp.configファイルに追加(または変更する)必要があります。 sqliteがuselegacyv2runtimeactivationpolicyフラグがtrueに設定されていない場合は機能しません
<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup>
私の工場出荷時の初期化コードは次のようになります(バージョンとpublickeytokenが含まれます)。この設定は、セットアップを実行したDev MachineのMachine.Configファイルから取得し、SQLiteをVisual Studio 2010に統合することを選択しました(すべてのプログラム SQLiteフォルダーから)。ファイルは @に配置されています
%WinDir%\Microsoft.NET\Framework\<FrameworkVersion>\CONFIG
<system.data> <DbProviderFactories> <remove invariant="System.Data.SQLite" /> <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" /> </DbProviderFactories> </system.data>
私の接続文字列には、パスのバックスラッシュの代わりにスラッシュが含まれており、バージョンが含まれています
<connectionStrings> <add name="connectionstringname" connectionString="Data Source=c:/temp/mydatabase.db;Version=3;" providerName="System.Data.SQLite"/> </connectionStrings>
それが役立つことを願っています。
更新:sqliteのx64バージョンを使用しているので、最初のヒントを忘れてください。しかし、私はそれを残します、多分それは他の人に役立つでしょう。
他のヒント
私が正しく覚えていれば、「例外を投げるタイプの初期化」は、通常、タイプの静的コンストラクターの何かが例外を投げたことを意味します。オープニングを試してみたいと思うかもしれません System.Data.SQLite.SQLiteFactory
ReflectorまたはDotPeekまたはJustDocompile、またはあなたが好むツールでは、その静的コンストラクター(.CCTOR)が何をしているかを確認します。 VS2010で.NET 4を使用し、VS2008に.NET 2/3を使用してTIを持っていますか?それも問題の一部かもしれません。