Type.GetType(string) で null が返ってきて困った

C#

主題の件で困ったので、解決方法をメモしておきます。

実行環境

  • .net Core 2.3
  • コンソールアプリケーション
  • Type.GetType() に与える引数は、別プロジェクトのアセンブリに存在するクラス
    (ただし、1つのソリューションに含めており、参照設定済み)

困ったこと

参照を保持しており、アセンブリもロード済みの状態になっているので、完全修飾クラス名を指定してやればメソッドは成功すると思っていました。

しかし、いざ実行してみると null が返ってきます。

コードで言うと、以下のような感じです。

コンソールアプリケーションとは別プロジェクトで、Hoge クラス(完全修飾名 This.Is.MyDll.Hoge)を作っておきます。

namespace This.Is.MyDll{
    public class Hoge
    {
        public string Name { get; set; }
    }
}

コンソールアプリケーション側で Type.GetType() します。
(あらかじめプロジェクト設定で This.Is.MyDll への参照を保持しているものとします)

namespace This.Is.MyConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            var hoge1 = new This.Is.MyDll.Hoge();

            // ↓ ここで null が返ってくる!
            var type = Type.GetType("This.Is.MyDll.Hoge");

            // ↓ type が null だから false になる
            var compare =  hoge1.GetType.Equals(type);
        }
    }
}

調査

いろいろ調べてみると、アセンブリをロードしていない場合は、バージョンとかパブリックキーとかが必要になるというのがわかりました。(こちらの記事参照(かなり古いですが・・・))

しかし、今回はプロジェクト設定で参照を設定しているし、そもそもコードの直前で Hoge を生成しているので、アセンブリの参照はされているはずです。

解決方法

いろいろやってみると、以下のようにDLL名を付加することで解決しました。

namespace This.Is.MyConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            var hoge1 = new This.Is.MyDll.Hoge();

            // ↓ コンマで後ろにDLL名を付与!
            var type = Type.GetType("This.Is.MyDll.Hoge, This.Is.MyDll");

            // ↓ true !!
            var compare =  hoge1.GetType.Equals(type);
        }
    }
}

なお、実行しているのは .net Core のため、もしかしたら .net Core 固有の解決方法なのかもしれません。

コメント

タイトルとURLをコピーしました