2017-05-22 31 views
1

データベースからすべてのデータを取得するClick-Once WPF Windowsアプリケーションを開発しています。ユーザーが対応するデータを入力できるフォームを実装し、SqlConnectionStringBuilderを使用して接続文字列を作成しても問題ありません。.NET WPFで永続的なユーザー接続文字列を格納する方法Click-Once

我々は、我々はいくつかの他のConfigurationUserLevelを使用する場合、アプリケーションがクラッシュは(私がなぜまだわかりませんが、私は、Entity Frameworkのモデルをロードしようと考えてい

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

を使用してのConfigurationManagerへの接続文字列を追加しますファイルが正しいユーザーレベルに格納されていないため、接続文字列は見つかりません。)今、私たちは別のファイルに接続文字列を格納し、我々はバージョン管理にチェックインする必要はありませんので、App.configファイルでそれをロードします。それは私たち自身が含まれているため

<connectionStrings configSource="connections.config"/> 

私たちは、このファイルを展開しません開発接続文字列。むしろ、ユーザーが入力した接続文字列が格納される展開用の空のファイルを作成します。これは完全に正常に動作します。

私たちの問題は、クリック一回更新では、ファイルが "失われる"ということです。永続的なユーザー単位の接続文字列を構成ファイルに暗号化して保存するにはどうすればよいですか?または、レジストリに完全に切り替える必要がありますか?または、%APPDATA%/Local/Apps/2.0/...../フォルダの外に独自の暗号化ファイルを作成し、Entity Framework Contextの初期化時に手動でロードしますか?

+1

アプリケーションがクラッシュした場合は、適切なログを追加してください。仮定しないでください。別の設定ファイルを使用することに問題はありません。適切なフォルダに保存する必要があります。これらのことはすべて非常によく文書化されています。 –

+1

資格情報を気にする人は、*使用しないでください*。代わりにWindows認証を使用してください。 OSとアプリケーションは、ユーザーが誰であるかをすでに知っています。あなたのアドバイスをいただきありがとうございます。 –

+0

こんにちはPanagiotis、ありがとうございます。私たちは現在、Loggingに取り組んでいます。 – LeoReentry

答えて

1

あなたはそれがコードの下の助けを借りて、あなたに

https://msdn.microsoft.com/en-us/library/dd997001.aspx を助けるかもしれないMSDNサイトにアクセスすることができます、あなたは、あなたの条件のために、このコードを変更する必要があり、これが役立つことを願っています。

System.DeploymentとのSystem.Windows.Formsへの参照を追加し、あなたのClickOnceアプリケーションでカスタムClickOnceアプリケーションのインストーラ

を作成します。

アプリケーションに新しいクラスを追加し、任意の名前を指定します。このチュートリアルでは、MyInstallerという名前を使用します。

新しいクラスの先頭に次のインポートまたはステートメントを追加します。

using System.Deployment.Application; 
using System.Windows.Forms; 

クラスに次のメソッドを追加します。

これらのメソッドは、展開マニフェストをダウンロードし、適切なアクセス許可をアサートし、インストールの許可をユーザーに要求してから、アプリケーションをダウンロードしてClickOnceキャッシュにインストールするためにInPlaceHostingManagerメソッドを呼び出します。カスタムインストーラーは、ClickOnceアプリケーションが事前に信頼されていることを指定したり、信頼の決定をAssertApplicationRequirementsメソッド呼び出しに延期することができます。このコードはアプリケーションを事前に信頼します 注: - 事前認証によって割り当てられた権限は、カスタムインストーラコードの権限を超えることはできません。

InPlaceHostingManager iphm = null; 

    public void InstallApplication(string deployManifestUriStr) 
    { 
     try 
     { 
      Uri deploymentUri = new Uri(deployManifestUriStr); 
      iphm = new InPlaceHostingManager(deploymentUri, false); 
     } 
     catch (UriFormatException uriEx) 
     { 
      MessageBox.Show("Cannot install the application: " + 
       "The deployment manifest URL supplied is not a valid URL. " + 
       "Error: " + uriEx.Message); 
      return; 
     } 
     catch (PlatformNotSupportedException platformEx) 
     { 
      MessageBox.Show("Cannot install the application: " + 
       "This program requires Windows XP or higher. " + 
       "Error: " + platformEx.Message); 
      return; 
     } 
     catch (ArgumentException argumentEx) 
     { 
      MessageBox.Show("Cannot install the application: " + 
       "The deployment manifest URL supplied is not a valid URL. " + 
       "Error: " + argumentEx.Message); 
      return; 
     } 

     iphm.GetManifestCompleted += new EventHandler<GetManifestCompletedEventArgs>(iphm_GetManifestCompleted); 
     iphm.GetManifestAsync(); 
    } 

    void iphm_GetManifestCompleted(object sender, GetManifestCompletedEventArgs e) 
    { 
     // Check for an error. 
     if (e.Error != null) 
     { 
      // Cancel download and install. 
      MessageBox.Show("Could not download manifest. Error: " + e.Error.Message); 
      return; 
     } 

     // bool isFullTrust = CheckForFullTrust(e.ApplicationManifest); 

     // Verify this application can be installed. 
     try 
     { 
      // the true parameter allows InPlaceHostingManager 
      // to grant the permissions requested in the applicaiton manifest. 
      iphm.AssertApplicationRequirements(true) ; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("An error occurred while verifying the application. " + 
       "Error: " + ex.Message); 
      return; 
     } 

     // Use the information from GetManifestCompleted() to confirm 
     // that the user wants to proceed. 
     string appInfo = "Application Name: " + e.ProductName; 
     appInfo += "\nVersion: " + e.Version; 
     appInfo += "\nSupport/Help Requests: " + (e.SupportUri != null ? 
      e.SupportUri.ToString() : "N/A"); 
     appInfo += "\n\nConfirmed that this application can run with its requested permissions."; 
     // if (isFullTrust) 
     // appInfo += "\n\nThis application requires full trust in order to run."; 
     appInfo += "\n\nProceed with installation?"; 

     DialogResult dr = MessageBox.Show(appInfo, "Confirm Application Install", 
      MessageBoxButtons.OKCancel, MessageBoxIcon.Question); 
     if (dr != System.Windows.Forms.DialogResult.OK) 
     { 
      return; 
     } 

     // Download the deployment manifest. 
     iphm.DownloadProgressChanged += new EventHandler<DownloadProgressChangedEventArgs>(iphm_DownloadProgressChanged); 
     iphm.DownloadApplicationCompleted += new EventHandler<DownloadApplicationCompletedEventArgs>(iphm_DownloadApplicationCompleted); 

     try 
     { 
      // Usually this shouldn't throw an exception unless AssertApplicationRequirements() failed, 
      // or you did not call that method before calling this one. 
      iphm.DownloadApplicationAsync(); 
     } 
     catch (Exception downloadEx) 
     { 
      MessageBox.Show("Cannot initiate download of application. Error: " + 
       downloadEx.Message); 
      return; 
     } 
    } 

    /* 
    private bool CheckForFullTrust(XmlReader appManifest) 
    { 
     if (appManifest == null) 
     { 
      throw (new ArgumentNullException("appManifest cannot be null.")); 
     } 

     XAttribute xaUnrestricted = 
      XDocument.Load(appManifest) 
       .Element("{urn:schemas-microsoft-com:asm.v1}assembly") 
       .Element("{urn:schemas-microsoft-com:asm.v2}trustInfo") 
       .Element("{urn:schemas-microsoft-com:asm.v2}security") 
       .Element("{urn:schemas-microsoft-com:asm.v2}applicationRequestMinimum") 
       .Element("{urn:schemas-microsoft-com:asm.v2}PermissionSet") 
       .Attribute("Unrestricted"); // Attributes never have a namespace 

     if (xaUnrestricted != null) 
      if (xaUnrestricted.Value == "true") 
       return true; 

     return false; 
    } 
    */ 

    void iphm_DownloadApplicationCompleted(object sender, DownloadApplicationCompletedEventArgs e) 
    { 
     // Check for an error. 
     if (e.Error != null) 
     { 
      // Cancel download and install. 
      MessageBox.Show("Could not download and install application. Error: " + e.Error.Message); 
      return; 
     } 

     // Inform the user that their application is ready for use. 
     MessageBox.Show("Application installed! You may now run it from the Start menu."); 
    } 

    void iphm_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
    { 
     // you can show percentage of task completed using e.ProgressPercentage 
    } 

コードからインストールを試みるには、InstallApplicationメソッドを呼び出します。たとえば、MyInstallerクラスに名前を付けた場合、次のようにInstallApplicationを呼び出すことができます。

MyInstaller installer = new MyInstaller(); 
installer.InstallApplication(@"\\myServer\myShare\myApp.application"); 
MessageBox.Show("Installer object created."); 
+0

ありがとう、それは非常に役立つようです。私はそれを見てみましょう! – LeoReentry

関連する問題