プロフィール

髭山髭人(ひげひと)

自分の書いた記事が、一人でも誰かの役に立てば...
活動信条の一つとして「貴方のメモは、誰かのヒント」というのがあります。

このサイトについて

本家HP packetroom.net から切り離した いわゆる技術メモ用のブログで、無料レンタルサーバーにて運用しています。広告表示はその義務なのでご容赦。
XREA さんには長年お世話になっています

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" 表記にすり替わった