Skip to content

Commit 2243679

Browse files
authored
Merge pull request #576 from ElektroKill/feature/preserve-marshaler-name
Preserve the type name string in `CustomMarshalType` if parsing it fails
2 parents 207e5e1 + cfc3c1e commit 2243679

3 files changed

Lines changed: 33 additions & 5 deletions

File tree

src/DotNet/MarshalBlobReader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ MarshalType Read() {
110110
var custMarshalerName = ReadUTF8String();
111111
var cmRef = custMarshalerName.DataLength == 0 ? null : TypeNameParser.ParseReflection(module, UTF8String.ToSystemStringOrEmpty(custMarshalerName), new CAAssemblyRefFinder(module), gpContext);
112112
var cookie = ReadUTF8String();
113-
returnValue = new CustomMarshalType(guid, nativeTypeName, cmRef, cookie);
113+
returnValue = new CustomMarshalType(guid, nativeTypeName, custMarshalerName, cmRef, cookie);
114114
break;
115115

116116
case NativeType.IUnknown:

src/DotNet/MarshalType.cs

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,7 @@ public ArrayMarshalType(NativeType elementType, int paramNum, int numElems, int
363363
public sealed class CustomMarshalType : MarshalType {
364364
UTF8String guid;
365365
UTF8String nativeTypeName;
366+
UTF8String custMarshalerTypeName;
366367
ITypeDefOrRef custMarshaler;
367368
UTF8String cookie;
368369

@@ -382,8 +383,18 @@ public UTF8String NativeTypeName {
382383
set => nativeTypeName = value;
383384
}
384385

386+
/// <summary>
387+
/// Gets/sets the custom marshaller type name string
388+
/// <remarks>This property is used when writing only when <see cref="CustomMarshaler"/> is null.</remarks>
389+
/// </summary>
390+
public UTF8String CustomMarshalerTypeName {
391+
get => custMarshalerTypeName;
392+
set => custMarshalerTypeName = value;
393+
}
394+
385395
/// <summary>
386396
/// Gets/sets the custom marshaler
397+
/// <remarks>This property takes priority over <see cref="CustomMarshalerTypeName"/> when writing.</remarks>
387398
/// </summary>
388399
public ITypeDefOrRef CustomMarshaler {
389400
get => custMarshaler;
@@ -427,7 +438,7 @@ public CustomMarshalType(UTF8String guid, UTF8String nativeTypeName)
427438
/// </summary>
428439
/// <param name="guid">GUID string</param>
429440
/// <param name="nativeTypeName">Native type name string</param>
430-
/// <param name="custMarshaler">Custom marshaler name string</param>
441+
/// <param name="custMarshaler">Custom marshaler type</param>
431442
public CustomMarshalType(UTF8String guid, UTF8String nativeTypeName, ITypeDefOrRef custMarshaler)
432443
: this(guid, nativeTypeName, custMarshaler, null) {
433444
}
@@ -437,18 +448,35 @@ public CustomMarshalType(UTF8String guid, UTF8String nativeTypeName, ITypeDefOrR
437448
/// </summary>
438449
/// <param name="guid">GUID string</param>
439450
/// <param name="nativeTypeName">Native type name string</param>
440-
/// <param name="custMarshaler">Custom marshaler name string</param>
451+
/// <param name="custMarshaler">Custom marshaler type</param>
441452
/// <param name="cookie">Cookie string</param>
442453
public CustomMarshalType(UTF8String guid, UTF8String nativeTypeName, ITypeDefOrRef custMarshaler, UTF8String cookie)
454+
: this(guid, nativeTypeName, null, custMarshaler, cookie) {
455+
}
456+
457+
/// <summary>
458+
/// Constructor
459+
/// </summary>
460+
/// <param name="guid">GUID string</param>
461+
/// <param name="nativeTypeName">Native type name string</param>
462+
/// <param name="custMarshalerTypeName">Custom marshaler name string</param>
463+
/// <param name="custMarshaler">Custom marshaler type</param>
464+
/// <param name="cookie">Cookie string</param>
465+
public CustomMarshalType(UTF8String guid, UTF8String nativeTypeName, UTF8String custMarshalerTypeName, ITypeDefOrRef custMarshaler, UTF8String cookie)
443466
: base(NativeType.CustomMarshaler) {
444467
this.guid = guid;
445468
this.nativeTypeName = nativeTypeName;
469+
this.custMarshalerTypeName = custMarshalerTypeName;
446470
this.custMarshaler = custMarshaler;
447471
this.cookie = cookie;
448472
}
449473

450474
/// <inheritdoc/>
451-
public override string ToString() => $"{nativeType} ({guid}, {nativeTypeName}, {custMarshaler}, {cookie})";
475+
public override string ToString() {
476+
if (custMarshaler is not null)
477+
return $"{nativeType} ({guid}, {nativeTypeName}, {custMarshaler}, {cookie})";
478+
return $"{nativeType} ({guid}, {nativeTypeName}, {custMarshalerTypeName}, {cookie})";
479+
}
452480
}
453481

454482
/// <summary>

src/DotNet/Writer/MarshalBlobWriter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ byte[] Write(MarshalType marshalType) {
9999
Write(custMarshaler.Guid);
100100
Write(custMarshaler.NativeTypeName);
101101
var cm = custMarshaler.CustomMarshaler;
102-
var cmName = cm is null ? string.Empty : FullNameFactory.AssemblyQualifiedName(cm, this);
102+
UTF8String cmName = cm is null ? custMarshaler.CustomMarshalerTypeName : FullNameFactory.AssemblyQualifiedName(cm, this);
103103
Write(cmName);
104104
Write(custMarshaler.Cookie);
105105
break;

0 commit comments

Comments
 (0)