diff --git a/src/DotNet/MarshalBlobReader.cs b/src/DotNet/MarshalBlobReader.cs index 0a8b7b3c..5932ae22 100644 --- a/src/DotNet/MarshalBlobReader.cs +++ b/src/DotNet/MarshalBlobReader.cs @@ -110,7 +110,7 @@ MarshalType Read() { var custMarshalerName = ReadUTF8String(); var cmRef = custMarshalerName.DataLength == 0 ? null : TypeNameParser.ParseReflection(module, UTF8String.ToSystemStringOrEmpty(custMarshalerName), new CAAssemblyRefFinder(module), gpContext); var cookie = ReadUTF8String(); - returnValue = new CustomMarshalType(guid, nativeTypeName, cmRef, cookie); + returnValue = new CustomMarshalType(guid, nativeTypeName, custMarshalerName, cmRef, cookie); break; case NativeType.IUnknown: diff --git a/src/DotNet/MarshalType.cs b/src/DotNet/MarshalType.cs index 432e51e4..7036fe38 100644 --- a/src/DotNet/MarshalType.cs +++ b/src/DotNet/MarshalType.cs @@ -363,6 +363,7 @@ public ArrayMarshalType(NativeType elementType, int paramNum, int numElems, int public sealed class CustomMarshalType : MarshalType { UTF8String guid; UTF8String nativeTypeName; + UTF8String custMarshalerTypeName; ITypeDefOrRef custMarshaler; UTF8String cookie; @@ -382,8 +383,18 @@ public UTF8String NativeTypeName { set => nativeTypeName = value; } + /// + /// Gets/sets the custom marshaller type name string + /// This property is used when writing only when is null. + /// + public UTF8String CustomMarshalerTypeName { + get => custMarshalerTypeName; + set => custMarshalerTypeName = value; + } + /// /// Gets/sets the custom marshaler + /// This property takes priority over when writing. /// public ITypeDefOrRef CustomMarshaler { get => custMarshaler; @@ -427,7 +438,7 @@ public CustomMarshalType(UTF8String guid, UTF8String nativeTypeName) /// /// GUID string /// Native type name string - /// Custom marshaler name string + /// Custom marshaler type public CustomMarshalType(UTF8String guid, UTF8String nativeTypeName, ITypeDefOrRef custMarshaler) : this(guid, nativeTypeName, custMarshaler, null) { } @@ -437,18 +448,35 @@ public CustomMarshalType(UTF8String guid, UTF8String nativeTypeName, ITypeDefOrR /// /// GUID string /// Native type name string - /// Custom marshaler name string + /// Custom marshaler type /// Cookie string public CustomMarshalType(UTF8String guid, UTF8String nativeTypeName, ITypeDefOrRef custMarshaler, UTF8String cookie) + : this(guid, nativeTypeName, null, custMarshaler, cookie) { + } + + /// + /// Constructor + /// + /// GUID string + /// Native type name string + /// Custom marshaler name string + /// Custom marshaler type + /// Cookie string + public CustomMarshalType(UTF8String guid, UTF8String nativeTypeName, UTF8String custMarshalerTypeName, ITypeDefOrRef custMarshaler, UTF8String cookie) : base(NativeType.CustomMarshaler) { this.guid = guid; this.nativeTypeName = nativeTypeName; + this.custMarshalerTypeName = custMarshalerTypeName; this.custMarshaler = custMarshaler; this.cookie = cookie; } /// - public override string ToString() => $"{nativeType} ({guid}, {nativeTypeName}, {custMarshaler}, {cookie})"; + public override string ToString() { + if (custMarshaler is not null) + return $"{nativeType} ({guid}, {nativeTypeName}, {custMarshaler}, {cookie})"; + return $"{nativeType} ({guid}, {nativeTypeName}, {custMarshalerTypeName}, {cookie})"; + } } /// diff --git a/src/DotNet/Writer/MarshalBlobWriter.cs b/src/DotNet/Writer/MarshalBlobWriter.cs index df5ead84..46ede9cd 100644 --- a/src/DotNet/Writer/MarshalBlobWriter.cs +++ b/src/DotNet/Writer/MarshalBlobWriter.cs @@ -99,7 +99,7 @@ byte[] Write(MarshalType marshalType) { Write(custMarshaler.Guid); Write(custMarshaler.NativeTypeName); var cm = custMarshaler.CustomMarshaler; - var cmName = cm is null ? string.Empty : FullNameFactory.AssemblyQualifiedName(cm, this); + UTF8String cmName = cm is null ? custMarshaler.CustomMarshalerTypeName : FullNameFactory.AssemblyQualifiedName(cm, this); Write(cmName); Write(custMarshaler.Cookie); break;