Skip to content

Commit 973e699

Browse files
committed
Special case STGMEDIUM field unmaaged type detection
1 parent 49d3245 commit 973e699

File tree

3 files changed

+24
-4
lines changed

3 files changed

+24
-4
lines changed

WinFormsComInterop.SourceGenerator/Generator.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,20 @@ private static void GenerateBlittableStructWrapper(IndentedStringBuilder source,
390390
source.AppendLine("}");
391391
return;
392392
}
393+
394+
if (type.ToDisplayString() == "System.Runtime.InteropServices.ComTypes.STGMEDIUM")
395+
{
396+
source.AppendLine($"struct {type.Name}_native");
397+
source.AppendLine("{");
398+
source.PushIndent();
399+
source.AppendLine($"public System.Runtime.InteropServices.ComTypes.TYMED tymed;");
400+
source.AppendLine($"public System.IntPtr unionmember;");
401+
source.AppendLine($"public System.IntPtr pUnkForRelease;");
402+
source.PopIndent();
403+
source.AppendLine("}");
404+
return;
405+
}
406+
393407
source.AppendLine($"struct {type.Name}_native");
394408
source.AppendLine("{");
395409
source.PushIndent();

WinFormsComInterop.SourceGenerator/MethodGenerationContext.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,15 @@ public Marshaller CreateElementMarshaller(IArrayTypeSymbol arrayTypeSymbol, stri
122122
return marshaller;
123123
}
124124

125-
public Marshaller CreateFieldMarshaller(IFieldSymbol fieldSymbol, string prefix, int index)
125+
public Marshaller CreateFieldMarshaller(IFieldSymbol fieldSymbol, ITypeSymbol parentType, string prefix, int index)
126126
{
127-
Marshaller marshaller = CreateMarshaller(fieldSymbol.Type, null);
127+
UnmanagedType? unmanagedType = GetMarshalAs(fieldSymbol.GetAttributes()).UnmanagedType;
128+
if (parentType.ToDisplayString() == "System.Runtime.InteropServices.ComTypes.STGMEDIUM" && fieldSymbol.Name == "pUnkForRelease")
129+
{
130+
unmanagedType = UnmanagedType.IUnknown;
131+
}
132+
133+
Marshaller marshaller = CreateMarshaller(fieldSymbol.Type, unmanagedType);
128134
marshaller.Name = prefix + "_" + fieldSymbol.Name;
129135
marshaller.Type = fieldSymbol.Type;
130136
marshaller.RefKind = RefKind.Ref;

WinFormsComInterop.SourceGenerator/StructMarshaller.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public override void ConvertToUnmanagedParameter(IndentedStringBuilder builder)
2525
continue;
2626
}
2727

28-
var marshaller = Context.CreateFieldMarshaller(fieldSymbol, LocalVariable, i);
28+
var marshaller = Context.CreateFieldMarshaller(fieldSymbol, Type, LocalVariable, i);
2929
builder.AppendLine($"var {marshaller.Name} = {Name}.{fieldSymbol.Name};");
3030
marshaller.ConvertToUnmanagedParameter(builder);
3131
builder.AppendLine($"{LocalVariable}.{fieldSymbol.Name} = {marshaller.LocalVariable};");
@@ -77,7 +77,7 @@ public override void MarshalOutputParameter(IndentedStringBuilder builder)
7777
continue;
7878
}
7979

80-
var marshaller = Context.CreateFieldMarshaller(fieldSymbol, LocalVariable, i);
80+
var marshaller = Context.CreateFieldMarshaller(fieldSymbol, Type, LocalVariable, i);
8181
builder.AppendLine($"var {marshaller.Name} = {LocalVariable}.{fieldSymbol.Name};");
8282
marshaller.ConvertToUnmanagedParameter(builder);
8383
if (MethodGenerationContext.IsBlittableType(fieldSymbol.Type))

0 commit comments

Comments
 (0)