2

Windows 7、.net4、および最新の WiX 3.7 の Votive アドインを使用して、Visual Studio 2010 を使用して msi を作成しています。

インストールは非常に複雑ですが、PC でテストすると問題なく動作します。

インストール中に、いくつかのカスタム アクションを実行します。これらのカスタム アクションの 1 つは、カスタム アクションでのみ必要なデータベース アクセス用の外部 SQLite dll を必要とします。

開発環境を持たないPCで実行すると、単純なWindows 7だけで、ファイルが見つからないというエラーが発生します。これは、この PC に SQLite がインストールされていないためです。

私が得るエラーは次のとおりです。

System.IO.FileNotFoundException: ファイルまたはアセンブリ 'System.Data.SQLite.dll' またはその依存関係の 1 つを読み込めませんでした。指定されたモジュールが見つかりませんでした。

詳細ログから、カスタム アクションがローカルの一時ファイルに抽出されて実行されていることがわかります。これはログ ファイルからの抜粋です。

(SERVER)     MSI (s) (74:C0) [09:08:07:527]: Executing op: ActionStart(Name=InitializeDbDeferred,,)
(UNKNOWN)    Action 09:08:07: InitializeDbDeferred.
(SERVER)     MSI (s) (74:C0) [09:08:07:528]: Executing op: CustomActionSchedule(Action=InitializeDbDeferred,ActionType=1025,Source=BinaryData,Target=InsertDefaultRepositoryDeferred,CustomActionData=DATA=C:\AXS Standalone NVR;REPOSITORYPATH=C:\AXS Repository - (Available Space: 364 (Gb));QUOTA=25)
(SERVER)     MSI (s) (74:88) [09:08:07:530]: Invoking remote custom action. DLL: C:\Windows\Installer\MSI4252.tmp, Entrypoint: InsertDefaultRepositoryDeferred
(UNKNOWN)     SFXCA: Extracting custom action to temporary directory: C:\Users\Admin\AppData\Local\Temp\MSI4252.tmp-\
(UNKNOWN)     SFXCA: Binding to CLR version v4.0.30319
(UNKNOWN)     Calling custom action CustomAction!CustomAction.CustomAction.InsertDefaultRepositoryDeferred
(UNKNOWN)     Exception thrown by custom action:
(UNKNOWN)     System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.IO.FileNotFoundException: Could not load file or assembly 'System.Data.SQLite.dll' or one of its dependencies. The specified module could not be found.
(UNKNOWN)     at CustomAction.CustomAction.InsertDefaultRepositoryDeferred(Session session)
(UNKNOWN)      --- End of inner exception stack trace ---

私の質問は、CA が一時的な場所から実行されているときに、インストール中に SQLite dll を「参照」するカスタム アクションを取得するにはどうすればよいですか? どうにかして、CA とその dll をパッケージ化する必要がありますか。

インストーラーに SQLite dll をファイルとして含めようとしましたが、一時的な場所にある CA はその場所を「認識」しませんでした。

CAにSQLite dllを見つける方法がわかりません。

4

2 に答える 2

3

ファイルまたはアセンブリ'System.Data.SQLite.dll'またはその依存関係の1つを読み込めませんでした

DTFは、すべてのプロジェクトコンテンツとアセンブリ参照を自動的に取得し、それらを最終的なネイティブDLLに圧縮します。カスタムアクションの存続期間中、tempディレクトリにSQLLiteアセンブリが表示されます。

「またはその依存関係の1つ」というエラーメッセージが表示されます。ILDASMまたは.NETReflectorを使用してDLLを調べ、そのDLLの参照が何であるかを確認します。次に、それらをアイテム(コンテンツコピー)または参照としてDTFプロジェクトに追加します。目標は、それらを最終的なDLLにパッケージ化して、一時ディレクトリに配置することです。

于 2013-03-06T13:15:12.537 に答える
3

他のシナリオに役立つ情報なので、他の答えは残しておきますが、今日の問題はもっと単純だと思います。

Votiveを使用してDTFC#カスタムアクションプロジェクトへの参照を追加すると、アセンブリ名が「System。」という単語で始まる場合、CopyLocal=Falseが自動的に設定されます。これは、.NETFrameworkに通常見られるDLLのパッケージ化を回避するためです。ただし、Microsoftは、「システム」アセンブリを他の再配布可能ファイルと一緒に出荷する習慣を身に付けています。

したがって、その参照用にCopyLocalをTrueに変更してみて、改善されるかどうかを確認してください。Ralphが言及したSystem.DataとSystem.Transactionsは、フレームワークに付属しています。

于 2013-03-06T13:51:34.867 に答える