.NET Framework4.7であれば、RichTextBoxに画像ファイルをドロップするとファイルのアイコンではなく画像が挿入されます。
.NET Framework4.6
.NET Framework4.7
この違いは何でしょうか? 仕様変更がされたということなのでしょうか?
RTF には幾つかのバージョンがあります。そしてRichTextBoxでどのバージョンが使用されるかは.NET Framework バージョンで異なっているようです。
元々はRichEd20.DLLがロード対象だったのですが、4.6においてはRichEd20.DLLよりも MsftEdit.DLLを優先利用するための機能が用意されました。しかし互換性上の理由から既定では RichEd20.DLL が引き続き利用されるようになっていました。
ところが4.7では、MsftEdit.DLLが優先利用されるよう変更されたようです。そのため .NET Framework4.6と4.7ではRichTextBoxに違いがあるようにみえてしまいます。
では4.7でもMsftEdit.DLLではなくRichEd20.DLLを利用するためにはどうすればいいのでしょうか?
4.6 以降では、この DLL バージョンのためのオプトアウトスイッチとしてDoNotLoadLatestRichEditControl が設けられました。app.config 上に下記の項目を追加することで動作を切り替えることができます。
1 2 3 4 5 |
<configuration> <runtime> <AppContextSwitchOverrides value="Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl=true"/> </runtime> </configuration> |
1 2 3 4 5 |
<configuration> <runtime> <AppContextSwitchOverrides value="Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl=false"/> </runtime> </configuration> |
実験してみると
1 |
<AppContextSwitchOverrides value="Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl=true"/> |
とすることで.NET Framework4.7以降でもこれまでと同じような動作をするようになります。また.NET Framework4.6より前であっても4以降であれば
1 |
<AppContextSwitchOverrides value="Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl=false"/> |
とすることで、画像ファイルをドラッグ&ドロップすることで画像を表示させることができます。.NET Framework3.5以前ではこの設定は効果がありません。