DotfuscatorでC#・WPFのアプリケーションを難読化する!(3)

前回ではDotfuscatorの基本的な操作方法についてご案内しました。

しかし、いざ難読化したWPFアプリケーションを起動しようとしたとしても、いろんなエラーが出て起動しなかったりします。

今回から数回にわたってWPFアプリケーションを難読化するときの注意事項やエラーの回避方法をご案内したいと思います。

其の一、ViewModelのフィールド名を難読化してはいけない

ビューモデルのフィールド名をDotfuscatorで難読化すると正常に動かなくなるようです。 下の例を見てみてください。

MainWindowViewModelクラス

class MainWindowViewModel : INotifyPropertyChanged
{
    …(省略)…

    private String status;
    public String Status
    {
        get => status;
        set
        {
            status = value;
            RaisePropertyChanged(nameof(Status));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void RaisePropertyChanged(string propertyName)
    {
        var handler = this.PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    …(省略)…
}

XAMLファイル

…(省略)…

    <TextBlock Grid.Row="3" Grid.ColumnSpan="2" Text="{Binding Status}" />

…(省略)…

一見問題なさそうに見えますね。

MainWindowViewModelクラスのStatusをXAMLのTextBlockにバインディングしています。

そしてそのStatusのセッターが呼ばれたときに、PropertyChangedイベントを発行して、 XAMLへもその変更が反映されるようにしています。

nameofが原因

PropertyChangedイベントを発行するときに使用している"nameof(Status)"の部分が問題っぽいです。

Releaseモードでコンパイルしたとき、そのタイミングでnameofの値は文字列定数に置き換えられるっぽいです。

つまりコンパイル時に、nameof(Status)は"Status"という文字列に置き換わっている、と。

そのためViewModel内の
public String Status
というプロパティ名を難読化で変換してしまうと、一致せずに不具合が生じてしまいます。

フィールド名を難読対象外としよう!

画面左側、"名前の変更"をクリックします。

"除外"をクリックします。

"型の追加"をクリックします。

"型を除外する"のチェックを外し、"名前"に".*ViewModel"と入力します。

上に新規追加された".*ViewModel"を右クリックします。

"プロパティの追加"をクリックします。

"名前"に".*(?

以上で設定は完了です!

ここで行った設定の内容としはて、末尾が"ViewModel"で終わるクラスの "Command"で終わらない名前のpublicプロパティは 難読化処理の対象外とする、という意味になります。

終わったら”ビルド"ボタンをクリックして、難読化をやりなおしましょう!

これで、ViewModelのプロパティへの変更がXAML側へ反映されない、というエラーは回避できると思います!

しかし、WPFアプリケーションの難読化で注意しなければいけないことはこれだけではありません。

次回も引き続き、他の注意事項をご案内していきます!

次回へ続く