SGEN を使用してシリアライゼーション アセンブリをプリコンパイルするプロジェクトがあります (/proxytypes フラグなし)。このプロジェクトでは、これまで内部にあったクラスが存在します (したがって、sgen はそれをそのままにしておきます)。クラスをパブリックにする必要がありますが、そうするだけで sgen が次のエラーで失敗します。
タイプ 'Infragistics.Shared.DisposableObject' は、参照されていないアセンブリで定義されています...'
このアセンブリは実際に参照されており、常に参照されています。参照されていない場合、アセンブリ自体はコンパイルされません。バージョンも正確に一致し、参照では特定のバージョンがオフになっています。
最初の紛らわしい部分は、このクラスには public 状態がない (public フィールドもプロパティもまったくない) ことです。これは、シリアル化の適切な候補にはなりません。
さらに紛らわしいのは、唯一無二のパブリック (ジェネリック) メソッドの where 句を削除すると、sgen がアセンブリを適切に処理できるようになることです。
これは、明示的に実装されていない公開された唯一のものを持つクラスです(インターフェイスには2つのメソッドが実装されていますが、関係ありません):
public class AppointmentDrawFilter : IUIElementDrawFilter
{
// This is a fluent method to register a type with its handler
public AppointmentDrawFilter Support<TUiElement>(DrawPhase phases, Func<UIElement, Appointment> retriever = null)
where TUiElement : UIElement // <-- commenting out (or changing UIElement to MarshalByRefObject) fixes sgen
{
// adds input to a couple dictionaries (failure still occurs with body commented out)
return this;
}
}
注: UIElement は、失敗したときに sgen が見つけられないタイプである DisposableObject から継承します。where 句をコメントアウトすると、UIElement はまだ別の場所で使用されていますが、sgen はそれについて不満を抱いていません。Support() メソッドを internal とマークすると、sgen は公開されているものだけを処理するため、sgen も完了できます。
そもそも、sgen が Web サービス以外のパブリック メソッドを気にするのはなぜでしょうか。
where句の存在だけでつまずくのはなぜですか?
この特定のケースで、アセンブリが明らかに存在するのに、sgen によってアセンブリが見つからないのはなぜですか?