我有一个项目,其中 SGEN 用于预编译序列化程序集(没有 /proxytypes 标志)。在这个项目中,有一个到目前为止一直是内部的类(因此 sgen 将不理会它)。我需要公开课程,这样做的简单行为会导致 sgen 失败并出现错误:
'Infragistics.Shared.DisposableObject' 类型是在未引用的程序集中定义的......'
这个程序集确实被引用了,并且总是被引用,否则程序集本身将无法编译。版本也完全匹配,并且参考已关闭特定版本。
第一个令人困惑的部分是这个类没有公共状态(没有公共字段,根本没有属性),这并不使它成为序列化的良好候选者。
更令人困惑的部分是,删除唯一公共(通用)方法上的 where 子句允许 sgen 很好地处理程序集。
这是一个类,上面只有一个公共的、非显式实现的东西(接口实现了两个方法,不相关):
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 继承自 DisposableObject,是 sgen 失败时找不到的类型。请注意,当我注释掉 where 子句时,UIElement 仍在其他地方使用,但 sgen 并没有对此感到不满。标记 Support() 方法内部也允许 sgen 完成,因为它只关心公共的东西。
为什么 sgen 首先会关心非 Web 服务的公共方法?
为什么它只会因为 where 子句的存在而绊倒?
为什么在这种特殊情况下,sgen 没有找到明显存在的程序集?