SGEN错误反映类型

4

我已经实现了在生成XML序列化程序集作为构建的一部分中提到的更改。

<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>

在构建exe项目时出现错误信息:

错误14:反射类型'myNamespace.myAssembly.myForm.MicroContact'时出现错误。 C:\dev\src\myClient\myClient\SGEN myClient

这是MicroContact的代码(没有什么独特之处):

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
我实在不了解 <SGen> 这个任务,但你尝试使用带有 /v 开关的命令行运行 sgen 了吗?请注意,我的翻译只涉及内容本身,不包括解释或其他额外信息。 - Marc Gravell
2个回答

6
如Marc Gravell所指出,运行sgen /v MyClient.exe在bin目录中可以获取更多信息。
问题是由于多个类共享相同的名称引起的,在这种情况下,两个窗体都实现了相同的MicroContact类,因为其中一个被从另一个窗体复制而来。

1
如果在xml序列化属性中列出了重复的XML属性、元素和类型名称,则可能会发生这种情况。 - Daniel McQuiston

0

如前面的回答中提到的 - 最常见的问题是重复的类型名称。然而,问题的解决方案是多种多样的:

  • 更改其中一个重复类型的名称或通过[XmlType("NewTypeName")] 改变它的xml序列化名称。
  • 为序列化类型声明 [System.Xml.Serialization.XmlType(AnonymousType = true)] 属性。
  • 为其中一个重复类型定义命名空间 - 例如,如果它用于 XML 元素类型,则使用 [XmlElement(Namespace="http://example.com")]

如果您以其他方式解决了此问题 - 我很想知道。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接