3

呼び出し元のアセンブリがデバッグ構成になっていると、動作が異なるアセンブリ内のメソッドを作成しようとしています。

具体的には、テンプレートを使用して電子メールを作成および送信するメーラー ライブラリがあります。クライアントに誤ってデバッグ メールをスパム送信したくないので、2 つのバージョンのSendMailメソッドを作成しようとしています。

アイデアは、デバッグ モードMailMessage.Recipientsではクリアされ、代わりにデフォルトのメール アドレスが使用されるというものです (つまり、私たち自身の内部メール アドレス)。呼び出し側で追加のコードや構成を必要とせずに、これを可能な限り透過的にしたいと考えています。

問題は、メーラー ライブラリが Nuget パッケージに組み込まれるため、常にリリース ビルドになることです。私はこのようなことをしたかった:

    [System.Diagnostics.Conditional("DEBUG")]
    private void SetDebugMode(MailMessage mail)
    {
        mail.To.Clear();
        mail.CC.Clear();
        mail.Bcc.Clear();

        mail.To.Add("support@example.com");
        mail.Subject += " [DEBUG]";
    }

    public void SendMail()
    {
        SmtpClient smtp = new SmtpClient();
        using (MailMessage mail = new MailMessage())
        {
            [...]
            SetDebugMode(mail);
            smtp.Send(mail);
        }
    }

呼び出しメソッドが Release 構成にある SendMail メソッドであるため、これは機能しません。

同じメソッド呼び出しを使用して、パブリック インターフェイスは同じままですが、この機能を取得する方法はありますか? 代替手段は、オプションのisDebug = falseパラメーターまたは構成設定またはそれらの線に沿った何かを使用することになると思いますが、このアセンブリの外部の他のコードを編集する必要なしにそれを行うことをお勧めします。

前もって感謝します。

4

2 に答える 2

0

このようなものはどうですか...

    #if DEBUG
    private void SetDebugMode(MailMessage mail) {
        mail.To.Clear();
        mail.CC.Clear();
        mail.Bcc.Clear();
        mail.To.Add("support@example.com");
        mail.Subject += " [DEBUG]"; }
    #endif

    public void SendMail() {
        SmtpClient smtp = new SmtpClient();
        using (MailMessage mail = new MailMessage()) {
        [...]
        #if DEBUG
        SetDebugMode(mail);
        #endif
        smtp.Send(mail); } }

このように、SetDebugMode メソッドとその呼び出しは、デバッグ モードでのみコンパイルされて使用されます。

于 2012-09-12T11:57:13.573 に答える
0

あなたはできませんでした:

#if DEBUG
  Mail.Subject += " [Debug]";
#endif

等?したがって、デバッグの場合、追加のコードを含む関数が 1 つあります。

また

if (System.Diagnostics.Debugger.IsAttached) Mail.Subject += "[DEBUG]";

于 2012-09-12T11:46:51.700 に答える