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")]
Если бы вы решили эту проблему по-другому - я бы хотел об этом узнать.