3

main.exeロードされたdllからdllをロードし、メインexeで定義された静的クラスを取得しようとするため、dllプロジェクトのコードは次のようになります。

static class DllClass
{
    static DllClass()
    {
        Assembly assembly = Assembly.GetEntryAssembly(); // line 1
        Type type = assembly.GetType("StaticClass");    //line 2
    }
}

ただし、2行目で次の例外が発生します

System.Reflection.TargetInvocationException: 呼び出しのターゲットによって例外がスローされました。---> System.TypeInitializationException: 'DllClass' の型初期化子が例外をスローしました。---> System.TypeInitializationException: 'DllClass' の型初期化子が例外をスローしました。---> System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。

ここでの問題は、静的クラス StatisClass がランタイムで何らかの形で見つからず、null を返すことだと思います。

それを解決する方法はありますか?

4

3 に答える 3

3

上記のコードで考えられる理由は 1 つだけです。assembly変数がNULL. では、これはいつ起こるのでしょうか?MSDNによると、ケースは 1 つだけです。

マネージ アセンブリがアンマネージ アプリケーションから読み込まれた場合、GetEntryAssembly メソッドは NULL を返すことができます。たとえば、アンマネージ アプリケーションが C# で記述された COM コンポーネントのインスタンスを作成する場合、C# コンポーネントから GetEntryAssembly メソッドを呼び出すと NULL が返されます。これは、プロセスのエントリ ポイントがマネージ アセンブリではなくアンマネージ コードであるためです。

この場合、@Beachwalker による回答も機能しません。また、タイプを動的にロードしている場合、コードはコンパイルさえしません。

于 2012-12-12T08:56:49.710 に答える
1

リフレクションを使用する場合、タイプはフルネームを使用してのみ取得できます。つまり、クラス名とともに「名前空間」を含めます。

したがって、2行目を次のように変更すると機能します。

Type type = assembly.GetType("NamespaceName.StaticClass");    //line 2
于 2012-12-12T09:13:11.567 に答える
0

以下を使用するだけではどうですか:

Type t = typeof(StaticClass) 

これが原因で NullReferenceException が発生している可能性があります。

「GetEntryAssembly メソッドは、マネージド アセンブリがアンマネージド アプリケーションから読み込まれたときに null 参照 (Visual Basic では Nothing) を返すことができます。たとえば、アンマネージド アプリケーションが C# で記述された COM コンポーネントのインスタンスを作成する場合、GetEntryAssembly への呼び出しはプロセスのエントリ ポイントがマネージ アセンブリではなくアンマネージ コードであるため、C# コンポーネントのメソッドは null を返します。」

(MSDN、http: //msdn.microsoft.com/library/system.reflection.assembly.getentryassembly(v=vs.80).aspx )

=> 必要なテスト:

if (assembly != null)
{
 ...
}
于 2012-12-12T08:54:47.447 に答える