2018年12月26日
川俣晶の縁側ソフトウェア技術雑記 total 2506 count

C#・型を列挙してもリフレクションでどうしても意図した型が出てこない

Written By: 川俣 晶連絡先

問題 §

 型を列挙してもリフレクションでどうしても意図した型が出てこない。

 たとえば、.NET Core 2.1にて、System.Runtime.dllにSystem.Guidが含まれているとドキュメントに書かれているし、Visual Studioのオブジェクトブラウザにもそう表示される。しかし、そのモジュールをGetTypesメソッドで列挙しても出てこない。

原因 §

 一部の型は、【型の転送】により、そこにあるかのように見せかけているが実際には別のDLL上に実装が存在する場合がある。その場合はGetTypesメソッドで列挙する対象にならない。つまり、あるはずの型が出てこない。

 System.Guidの場合は実際にはSystem.Runtime.dllではなくSystem.Private.CoreLib.dllに実装が含まれている。System.Runtime.dllを列挙してもSystem.Guidは出てこないが、System.Private.CoreLib.dllを列挙すると出てくる。

解決 §

 GetReferencedAssembliesメソッドを使って、そこから参照されているアセンブリも列挙する。System.Runtime.dllからSystem.Private.CoreLib.dllは参照されているので、これで意図した型を発見できる。