2011-11-07 87 views
4

我已实施建设的exe项目Generating an Xml Serialization assembly as part of my buildSGEN误差反映类型

<Target Name="AfterBuild" DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource" Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)" Outputs="$(OutputPath)$(_SGenDllName)"> 
    <!-- Delete the file because I can't figure out how to force the SGen task. --> 
    <Delete Files="$(TargetDir)$(TargetName).XmlSerializers.dll" ContinueOnError="true" /> 
    <SGen BuildAssemblyName="$(TargetFileName)" BuildAssemblyPath="$(OutputPath)" References="@(ReferencePath)" ShouldGenerateSerializer="true" UseProxyTypes="false" KeyContainer="$(KeyContainerName)" KeyFile="$(KeyOriginatorFile)" DelaySign="$(DelaySign)" ToolPath="$(SGenToolPath)" Platform="$(Platform)"> 
     <Output TaskParameter="SerializationAssembly" ItemName="SerializationAssembly" /> 
    </SGen> 
</Target> 

错误消息的接受的答案中提到的变化:

错误14有反射型“的错误了myNameSpace .myAssembly.myForm.MicroContact”。 C:\ dev的\ SRC \ myClient \ myClient \ SGEN myClient

下面是微代码(没有什么独特之处这里):

Public Class MicroContact 
    Implements IComparable 

    Private _id As Long 
    Private _name As String 

    Public Property Id() As Long 
     Get 
      Return _id 
     End Get 
     Set(ByVal value As Long) 
      _id = value 
     End Set 
    End Property 

    Public Property NoTitleFullName() As String 
     Get 
      Return _name 
     End Get 
     Set(ByVal value As String) 
      _name = value 
     End Set 
    End Property 

    Public Sub New() 
     _name = "" 
    End Sub 

    Public Sub New(ByVal id As Long, ByVal name As String) 
     _id = id 
     _name = name 
    End Sub 

    Public Function CompareTo(ByVal obj As Object) As Integer Implements System.IComparable.CompareTo 
     Return String.Compare(Me.NoTitleFullName, CType(obj, MicroContact).NoTitleFullName, True) 
    End Function 

End Class 

有什么办法,我可以得到的内部异常可能会出现构建错误?

+4

我真的不知道''*任务*,但是您是否曾尝试在命令行使用'/ v'开关运行sgen? –

回答

6

正如Marc Gravell指出的,在bin目录下运行sgen /v MyClient.exe可以获得更多信息。

问题是由多个类共享相同的名称引起的,在这种情况下,两个表单都实现了相同的MicroContact类,因为一个类从另一个类复制而来。

+1

如果您重复了xml序列化属性中列出的XML属性,元素和类型名称,也会发生这种情况 –

0

正如在前面的答案中提到的 - 问题通常是重复的类型名称。然而到了问题的方法是不同的:

  • 更改复制的类型之一的名称或通过[XmlType("NewTypeName")]
  • 申报[System.Xml.Serialization.XmlType(AnonymousType = true)]属性针对序列类型更改其XML序列化的名字。
  • 定义一个命名空间,重复类型的一个 - 例如,如果它是用于XML元素类型,然后使用[XmlElement(Namespace="http://example.com")]

如果以另一种方式解决了这个问题 - 我想知道。