Все
По сути, моей службе WCF необходимо подключиться к серверу DCOM и получить структуру, содержащую поле «VARIANT», а затем передать ее моему клиенту службы WCF.
Это мой контракт данных WCF для этой структуры, полученный от собственной службы DCOM
[DataContract]
[ComVisible(true)]
[StructLayout(LayoutKind.Sequential)]
public struct tagProcReadAns
{
[DataMember]
[MarshalAs(UnmanagedType.Struct)]
public object vItemValue; //VARIANT: marshalled as object in C#
[DataMember]
public ushort wQuality;
[DataMember]
public Int32 Error;}
так как я ожидал, что этот контракт данных может быть зарегистрирован как объект COM и снова перенесен в код C ++, поэтому у меня есть части [ComVisible] и [MarshalAs]
В любом случае, vItemValue - это объект VARIANT, который я успешно получил с сервера DCOM (я проверил содержимое). Однако, когда я столкнулся с исключениями, когда я попытался передать его через WCF.
Я ожидал, что данные, содержащиеся в vItemValue VARIANT, имеют "тип байтового массива", так как я увидел, что значение VARIANT.vt равно "VTUI1 | VT_ARRAY", поэтому я изменяю DataContract следующим образом
[DataContract]
[KnownType(TypeOf(byte[])] //new
[ComVisible(true)]
[StructLayout(LayoutKind.Sequential)]
public struct tagProcReadAns
{
[DataMember]
[MarshalAs(UnmanagedType.Struct)]
public object vItemValue; //VARIANT: marshalled as object in C#
[DataMember]
public ushort wQuality;
[DataMember]
public Int32 Error;}
Однако, когда я снова запускаю код, я все еще обнаружил исключение, добавив трассировку, у меня появляются следующие сообщения об ошибках
There was an error while trying to serialize parameter http://tempuri.org/:aryAns. The InnerException message was 'Type 'System.Byte[*]' with data contract name 'ArrayOfunsignedByte:http://schemas.microsoft.com/2003/10/Serialization/Arrays' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.'. Please see InnerException for more details.
Кажется, что тип данных - это не byte [], а byte [*] ?? Что-то не так я сделал?
и, как предполагает исключение, я могу использовать DataContractResolver, чтобы как-то решить эту проблему, можете ли вы предложить какие-либо решения?
спасибо