C# SGEN在公共泛型方法的where子句上失败

C# SGEN在公共泛型方法的where子句上失败,c#,.net,serialization,sgen,C#,.net,Serialization,Sgen,我有一个项目,其中SGEN用于预编译序列化程序集(不带/proxytypes标志)。在这个项目中,有一个类,到目前为止,它一直是内部的(因此,sgen将不去管它)。我需要公开该类,这样做的简单行为会导致sgen失败并出现错误: “Infragistics.Shared.DisposableObject”类型是在未引用的程序集中定义的…” 此程序集确实被引用,并且始终被引用,否则程序集本身将无法编译。版本也完全匹配,并且引用已关闭特定版本 第一个令人困惑的部分是,这个类没有公共状态(没有公共字段,

我有一个项目,其中SGEN用于预编译序列化程序集(不带/proxytypes标志)。在这个项目中,有一个类,到目前为止,它一直是内部的(因此,sgen将不去管它)。我需要公开该类,这样做的简单行为会导致sgen失败并出现错误:

“Infragistics.Shared.DisposableObject”类型是在未引用的程序集中定义的…”

此程序集确实被引用,并且始终被引用,否则程序集本身将无法编译。版本也完全匹配,并且引用已关闭特定版本

第一个令人困惑的部分是,这个类没有公共状态(没有公共字段,根本没有属性),这并不能使它成为序列化的好候选者

更令人困惑的是,删除一个且唯一的公共(通用)方法上的where子句可以让sgen很好地处理程序集

下面是一个类,它只有一个公共的、未显式实现的对象(有两个方法是为接口实现的,不相关):

公共类任命DrawFilter:IUIElementDrawFilter
{
//这是一个用处理程序注册类型的fluent方法
公共任命DrawFilter支持(DrawPhase阶段,Func retriever=null)

其中TUiElement:UIElement/我对此进行了一些测试,并找到了一种可能的解决方法,您可以使用

我发现,如果您有一个泛型方法,其中包含一个where子句,该子句从当前程序集中没有派生任何类型的程序集中引用类型(或where子句引用的类型的基类型),则可以复制该方法

例如,我发现的问题的最简单再现是:

类库1具有以下C#代码:

类库2使用以下C#代码:

虽然我没有找到您提出的三个问题的答案,但我确实发现实际错误是System.Xml.Serialization.Compiler类的编译方法中的System.InvalidOperationException:

System.InvalidOperationException occurred
  Message=Unable to generate a temporary class (result=1).
error CS0012: The type 'One.BaseObject' is defined in an assembly that is not referenced. You must add a reference to assembly 'One, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

  Source=System.Xml
  StackTrace:
       at System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns, XmlSerializerCompilerParameters xmlParameters, Evidence evidence)
  InnerException: 
我能够使用以下代码从上面复制这个引用程序集1和2:

Type type = typeof(TestClass);
Assembly assembly = type.Assembly;
XmlReflectionImporter importer = new XmlReflectionImporter();
XmlTypeMapping mapping = importer.ImportTypeMapping(type);
CompilerParameters parameters = new CompilerParameters();
Assembly xmlAssembly = XmlSerializer.GenerateSerializer(new Type[] { type }, new XmlMapping[] { mapping }, parameters);
与我前面建议的解决方法一样,如果添加了从assembly One中的类派生的第二种类型,则可以避免异常

组件二需要额外的类:

public class Test : BaseObject
{
}
已更新用于生成序列化程序集的逻辑:

Type type = typeof(TestClass);
Assembly assembly = type.Assembly;
XmlReflectionImporter importer = new XmlReflectionImporter();
XmlTypeMapping mapping = importer.ImportTypeMapping(type);
Type type2 = typeof(Test);
XmlReflectionImporter importer2 = new XmlReflectionImporter();
XmlTypeMapping mapping2 = importer2.ImportTypeMapping(type2);
CompilerParameters parameters = new CompilerParameters();
Assembly xmlAssembly = XmlSerializer.GenerateSerializer(new Type[] { type, type2 }, new XmlMapping[] { mapping, mapping2 }, parameters);

不幸的是,8.0A版本的Windows SDK中包含的SGEN版本似乎已经解决了我遇到的问题,在升级之前我无法测试您的建议。感谢您的响应,
SGEN
标记在这里很少受到关注。
System.InvalidOperationException occurred
  Message=Unable to generate a temporary class (result=1).
error CS0012: The type 'One.BaseObject' is defined in an assembly that is not referenced. You must add a reference to assembly 'One, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

  Source=System.Xml
  StackTrace:
       at System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns, XmlSerializerCompilerParameters xmlParameters, Evidence evidence)
  InnerException: 
Type type = typeof(TestClass);
Assembly assembly = type.Assembly;
XmlReflectionImporter importer = new XmlReflectionImporter();
XmlTypeMapping mapping = importer.ImportTypeMapping(type);
CompilerParameters parameters = new CompilerParameters();
Assembly xmlAssembly = XmlSerializer.GenerateSerializer(new Type[] { type }, new XmlMapping[] { mapping }, parameters);
public class Test : BaseObject
{
}
Type type = typeof(TestClass);
Assembly assembly = type.Assembly;
XmlReflectionImporter importer = new XmlReflectionImporter();
XmlTypeMapping mapping = importer.ImportTypeMapping(type);
Type type2 = typeof(Test);
XmlReflectionImporter importer2 = new XmlReflectionImporter();
XmlTypeMapping mapping2 = importer2.ImportTypeMapping(type2);
CompilerParameters parameters = new CompilerParameters();
Assembly xmlAssembly = XmlSerializer.GenerateSerializer(new Type[] { type, type2 }, new XmlMapping[] { mapping, mapping2 }, parameters);