3

私はプロジェクトでいくつかのコード分析を行い、意味のある提案を実装している最中です。1つの提案は、次のことを行うことです。

CA2000:Microsoft.Reliability:メソッド'Service.ParseConfigurationFile()'で、オブジェクト' new SecureString()'へのすべての参照がスコープ外になる前に、System.IDisposable.Disposeを呼び出します。

問題のある行は次のとおりです。

 Password = me.Password.Aggregate(new SecureString(), (secureString, c) => { secureString.AppendChar(c); return secureString; })

これを適切に行う方法についてのアイデアはありますか?上記を下の行に置き換えましたが、それでもコード分析メッセージが表示されるため、正しくないと思います。

Password = me.Password.Aggregate(new SecureString(), (secureString, c) => { using (secureString) {secureString.AppendChar(c); return secureString;} })

編集:以下の@Jonからのコメントによると、objectInstanceはMailboxElement(me)と呼ばれるカスタムクラスのインスタンスです。次のような設定ファイルの複数のカスタムセクションを通過します。

foreach (MailboxElement me in mailboxesSection.Mailboxes)
{
      MailboxInformation mailboxInformation = new MailboxInformation
      {
                    ExchangeServerWebServiceUrl = me.ExchangeServerWebServiceUrl,
                    MailboxFriendlyName = me.FriendlyName,
                    UserName = me.UserName,
                    Password = me.Password.Aggregate(new SecureString(), (secureString, c) => { secureString.AppendChar(c); return secureString; }),
                    MailboxToAccess = me.MailboxToAccess
      };

      // Do stuff with mailboxInformation here
}

MailboxElement上記のすべてのプロパティを持つConfigurationElementを実装する封印されたクラスです。

MailboxInformation次のように定義されます。

public class MailboxInformation
{
   public string MailboxFriendlyName { get; set; }
   public string UserName { get; set; }
   public SecureString Password { get; set; }
   public string ExchangeServerWebServiceUrl { get; set; }
   public string MailboxToAccess { get; set; }
   public string InboxFolderId { get; set; }
   public string SentItemsFolderId { get; set; }
   public bool MailboxSettingsDiscovered { get; set; }
}

これが物事をより明確にすることを願っています...

4

3 に答える 3

3

アグリゲーションからIDispoableを返すので、それを破棄するか、単にsecureStringに再割り当てする必要があります

using (var secureString = new SecureString()) {
    secureString = objectInstance.Password.Aggregate((secureString, c) => { secureString.AppendChar(c); return secureString; }){
}

質問の更新後に編集

MailboxInformationオブジェクトがIDisposableの所有権を取得するようになったため、オブジェクト自体がMailboxInformationIDisposableであり、所有するディスポーザブルを破棄する必要があります。

したがって、実装は(あなたのコメントと同様に)なります

public class MailboxInformation : IDisposeable
{
   //...
   public SecureString Password { get; set; }
   //...
   void IDisposable.Dispose() {
      this.Password.Dispose();
   }
}
于 2012-07-03T10:29:37.283 に答える
1

この形式を試してください:

using (var secureString = new SecureString()) {
    Password = objectInstance.Password.Aggregate([...])
}

using私が信じる声明ですべてを包む方が良いです。

于 2012-07-03T10:10:14.890 に答える
1

このリンクにより、それは壊れたルールであり、それを考慮する必要はありません。そのルールを無視してください。

C#のベースコンストラクターにオブジェクト参照を渡すCA2000

http://www.debugging.com/bug/24060

于 2012-07-03T10:12:49.623 に答える