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;