SGEN ошибка, отражающая тип

Я реализовал изменение, упомянутое в принятом ответе " Создание сборки сериализации 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

Есть ли способ, которым я могу получить внутреннее исключение ошибки сборки, возможно?

2 ответа

Решение

Как Марк Гравелл указал на бег sgen /v MyClient.exe в каталоге bin выдается больше информации.

Проблема была вызвана тем, что несколько классов имели одно и то же имя. В этом случае две формы реализовали один и тот же класс MicroContact, поскольку один был скопирован из другого.

Как уже упоминалось в предыдущем ответе, проблема чаще всего заключается в дублировании имен типов. Однако решения проблемы различны:

  • Измените имя одного из дублированных типов или измените его имя сериализации XML с помощью [XmlType("NewTypeName")]
  • декларировать [System.Xml.Serialization.XmlType(AnonymousType = true)] атрибут для сериализованного типа.
  • Определите пространство имен для одного из дублированных типов - например, если оно используется для типа элемента XML, используйте [XmlElement(Namespace="http://example.com")]

Если бы вы решили эту проблему по-другому - я бы хотел об этом узнать.

Другие вопросы по тегам