次のコードを実行しようとすると (2 つの別個のアセンブリ)
ClassLibrary.cs
public interface ITest
{
}
Program.cs
using System;
public class TestClass
{
public void Test<T>(T x) where T : ITest { }
}
static class Program
{
static void Main(string[] args)
{
new System.Xml.Serialization.XmlSerializer(typeof(TestClass));
}
}
次のコマンドを使用して Windows 7 64 ビットでコンパイル:
c:\Windows\Microsoft.NET\Framework\v2.0.50727\csc /target:library ClassLibrary.cs
c:\Windows\Microsoft.NET\Framework\v2.0.50727\csc /reference:ClassLibrary.dll Program.cs
私はこの例外を受けています:
System.InvalidOperationException: 一時クラスを生成できません (結果 = 1)。エラー CS0012: ITest 型は、参照されていないアセンブリで定義されています。アセンブリ ClassLibrary、Version=0.0.0.0、Culture=neutral、PublicKeyToken=null ヒンズーへの参照を追加する必要があります。
System.Xml.Serialization.Compiler.Compile (アセンブリの親、文字列 ns、XmlSerializerCompilerParameters xmlParameters、証拠の証拠)
で System.Xml.Serialization.TempAssembly.GenerateAssembly (XmlMapping[] xmlMappings、Type[] の種類、文字列 defaultNamespace、証拠の証拠、 XmlSerializerCompilerParameters パラメーター、アセンブリ アセンブリ、Hashtable アセンブリ) の System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings、Type[] タイプ、文字列の defaultNamespace、文字列の場所、証拠の証拠) の System.Xml.Serialization.XmlSerializer.GenerateTempAssembly System.Xml.Serialization.XmlSerializer..ctor (型の種類、文字列の defaultNamespace) で Program.Main(String[] args) で (XmlMapping xmlMapping、型の型、文字列の defaultNamespace)
where T : ITestをTestClassから削除するか、ジェネリックをまったく使用しない (たとえば、public void Test(ITest x)を使用する) と、例外がスローされなくなりますが、実際のアプリケーションではこの構成が必要です。
XmlSerializer が where 制約を処理できない理由を理解している人はいますか?