3

VisualStudioで簡単なWPFアプリケーションを作成しました。

次の接続文字列を使用して、独自のディレクトリにある独自のデータベースファイルにアクセスします。

System.Environment.CurrentDirectory + @"\Data\" + databaseFileName;

[公開]をクリックして、基本的にすべてのデフォルトを受け入れました(CD / DVD公開、オンライン更新なし)。

セットアップフォルダを別のコンピュータにコピーしました。

新しいコンピューターで、 setup.exeをダブルクリックしました。

正常にインストールされ、スタートメニューにありますが、実行すると次のエラーが発生します。

代替テキストhttp://www.deviantsart.com/upload/11jfc2c.png

プロジェクト/プロパティ/セキュリティで可能なすべての権限をアプリケーションに付与しました。

代替テキストhttp://www.deviantsart.com/upload/si6urj.png

ClickOnceを使用してデプロイされたこのアプリケーションが、.exeファイルの下の相対ディレクトリ(「Data / MainData.mdf」)でデータベースを見つけることができるようにするには、何を変更する必要がありますか?

補遺以下の回答の修正はWindows7で機能しますが、WindowsXPでは次のようになります。

代替テキストhttp://www.deviantsart.com/upload/1pds19l.png

4

1 に答える 1

4

まず、データとしてデプロイします。接続文字列はこれを示しています。DataDirectoryは、ClickOnceキャッシュの下のDataフォルダーに変換されます。これは、ファイルがデータとしてマークされている場合、ClickOnceがファイルを配置する場所です。

ここに展開したくないが、[exe]に関連して配置したい場合は、[公開]タブの[アプリケーションファイル]ダイアログに移動し、[インクルード(データ)]から[インクルード]に変更します。次に、exeの場所に相対的な場所に配置します。(つまり、プロジェクト内のフォルダーにある場合は、展開されたexeの下の対応するフォルダーに配置されます)。接続文字列を変更することを忘れないでください。

その場所にデプロイすると、アップデートを発行したときに失われます。(ちょうどあなたが知っているので)。この問題を回避するためにデータを他にどこに置くことができるかについての考えは次のとおりです。

ClickOnceの更新からデータを安全に保つ方法

接続文字列を動的に作成する必要があります。Path.Combine(System.Windows.Forms.Application.StartupPath、 "Data \ mydatabase.mdf"); または、現在のアセンブリのデフォルトパス(この場合は.NET)から開始します。

- 添加 -

ああ、WPF、申し訳ありませんが、それを逃しました。基本的に、exeが実行されているフォルダを取得する必要があります。これが役立つかどうかを確認してください。

System.Reflection名前空間:

Assembly assemblyInfo = Assembly.GetExecutingAssembly();
if (assemblyInfo != null)
{
    //try Path.GetDirectoryName(assemblyInfo.Location)
    //if that doesn't work, try assemblyInfo.CodeBase 
}

(VSTOアプリでは、dllがシャドウイングされるため、CodeBaseを使用する必要があります。Locationは通常のアプリで機能すると思います。)

RobinDotNet

于 2010-01-16T00:46:59.860 に答える