C# WPF 名前空間(とアセンブリ名)の動的取得メモ
経緯など
- 環境
C# / WPF / VisualStudioCommunity 2022
ドット打ちした自作マウスカーソルを使う為、ググって以下のような処理を仕込んだ。
性質としては、プロジェクト内にファイルを置く + ファイルプロパティを「ビルドアクション:埋め込みリソース」にすると
Cursor
として利用できる…というもの。 ( System.Windows.Input.Cursor
)
var assembly = System.Reflection.Assembly.GetExecutingAssembly();
CursorHandOpen = new Cursor(assembly.GetManifestResourceStream(assembly.GetName().Name + ".hand_open.cur"));
CursorHandGrip = new Cursor(assembly.GetManifestResourceStream(assembly.GetName().Name + ".hand_grip.cur"));
最初は問題なく取得できていたが、
後付けで プロジェクト設定からアセンブリ名を変更 したら、NullException
で蹴られるようになった
原因
本来、名前空間をもとにカーソルファイル(リソース)を得なければいけない所を、
assembly.GetName().Name
を使っていた為に アセンブリ名側が参照されてしまっていた。
( ※ 初期状態は プロジェクトのアセンブリ名 ⇔ 既存(初期)の名前空間 が同じだった為、たまたま処理が通っていただけ )
解決 : 名前空間を取得
以下のようなテイで、"それ"が属する名前空間を得られました。
microsoft.com - Type.Namespace プロパティ
namespace HogeNameSpace
{
public partial class MainWindow : Window
{
public MainWindow()
{
// "HogeNameSpace"
string namespaceA = typeof(MainWindow).Namespace;
// "HogeNameSpace"
string namespaceB = this.GetType().Namespace;
InitializeComponent();
}
}
}
+ CursorHandOpen = new Cursor(assembly.GetManifestResourceStream(this.GetType().Namespace + ".hand_open.cur"));
+ CursorHandGrip = new Cursor(assembly.GetManifestResourceStream(this.GetType().Namespace + ".hand_grip.cur"));
- CursorHandOpen = new Cursor(assembly.GetManifestResourceStream(assembly.GetName().Name + ".hand_open.cur"));
- CursorHandGrip = new Cursor(assembly.GetManifestResourceStream(assembly.GetName().Name + ".hand_grip.cur"));
オマケ : アセンブリ名取得 ( 雑検証 )
タイミング次第で正しく得られなくなることも考えられる?
assembly.GetName().Name |
プロジェクト⇒アプリケーション⇒アセンブリ名 |
Application.ResourceAssembly.GetName().Name |
プロジェクト⇒アプリケーション⇒アセンブリ名 |
Assembly.GetExecutingAssembly().GetName().Name |
プロジェクト⇒アプリケーション⇒アセンブリ名 ※1 |
※1… 例外発生時(IDEデバッグ中)は "PresentationCore"
表記にすり替わった