6

そのタイプのアセンブリは現在実行中のアセンブリではないため、コードType.GetType(myTypeName)が返されるという問題がありました。null

この問題について私が見つけた解決策は次のとおりです。

var assemblies = AppDomain.CurrentDomain.GetAssemblies();
Type myType = assemblies.SelectMany(a => a.GetTypes())
                        .Single(t => t.FullName == myTypeName);

問題は、このコードを最初に実行すると例外が発生することです"Sequence contains no matching element"。コードのこの部分をもう一度呼び出すと、すべて問題なく、必要なタイプがロードされます。

誰かがそのような行動を説明できますか?最初の呼び出しの範囲で、必要なアセンブリ/タイプが見つからないのはなぜですか?

4

5 に答える 5

4

あなたが直面している問題は、クラスのGetAssembliesメソッドの設計が原因ですAppDomain- ドキュメントによると、このメソッド:

このアプリケーション ドメインの実行コンテキストに読み込まれたアセンブリを取得します。

したがって、プログラムで型が初めて見つからない場合、そのアセンブリはまだアプリケーションによって明らかにロードされていません。その後、問題の型を含むアセンブリの機能が使用された場合、アセンブリは既に読み込まれており、同じコードで欠落している型を既に見つけることができます。

アセンブリを直接ロードしてみてください。使用する代わりに:

var assemblies = AppDomain.CurrentDomain.GetAssemblies();

あなたが使用することができます:

List<Assembly> assemblies = Assembly.GetEntryAssembly().GetReferencedAssemblies().Select(assembly => Assembly.LoadFrom(assembly.Name)).ToList();
于 2012-09-14T11:07:54.367 に答える
2

タイプがまだロードされていないアセンブリにある可能性があります。プログラムの後半ではそうなります。出力ウィンドウを見ると、アセンブリがいつロードされているかがわかります。

于 2012-09-14T10:34:25.510 に答える
0

そして、mscorlibアセンブリを除外すると?? 、これを試すことができます:

  var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(asb=>!asb.FullName.StartsWith("mscorlib")).ToList();

Type myType = assemblies.SelectMany(a => a.GetTypes())
                        .Single(t => t.FullName == myTypeName);
于 2012-09-14T11:06:36.870 に答える