我有一个项目,其中SGEN用于预编译序列化程序集(不带/ proxytypes标志)。在这个项目中,生活到目前为止一直是内部的课程(因此sgen将离开它)。我需要公开课程,而这样做的简单行为会导致sgen失败,并显示错误:SGEN公共泛型方法的where子句失败
类型'Infragistics.Shared.DisposableObject'在未引用的程序集中定义...'
这个程序集确实被引用了,并且总是有,否则程序集本身不会编译。版本也完全匹配,并且引用已关闭特定版本。
第一个令人困惑的部分是这个类没有公共状态(没有公共字段,根本没有属性),这并没有使它成为序列化的好候选者。
更容易混淆的部分是,删除one-and-only公共(通用)方法中的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会首先关心非webservices公共方法?
为什么它只会在where子句的存在上绊倒?
为什么在这个特殊情况下sgen没有发现组件,当它明显存在时?
不幸的是包含在Windows SDK的8.0A版本SGEN的版本似乎有解决了我遇到的问题,在升级之前我无法测试您的建议。感谢您的回应,'sgen'标签在这里很少受到关注。 – roken