@@ -51,19 +51,26 @@ private static IntPtr AllocateRefCountedHandle(ManagedObjectWrapperHolder holder
51
51
/// <param name="fpRelease">Function pointer to Release.</param>
52
52
public static unsafe void GetIUnknownImpl ( out IntPtr fpQueryInterface , out IntPtr fpAddRef , out IntPtr fpRelease )
53
53
{
54
- fpQueryInterface = ( IntPtr ) ( delegate * unmanaged< IntPtr , Guid * , IntPtr * , int > ) & ComWrappers . IUnknown_QueryInterface ;
54
+ fpQueryInterface = ( IntPtr ) ( delegate * unmanaged[ MemberFunction ] < IntPtr , Guid * , IntPtr * , int > ) & ComWrappers . IUnknown_QueryInterface ;
55
55
fpAddRef = ( IntPtr ) ( delegate * < IntPtr , uint > ) & RuntimeImports . RhIUnknown_AddRef ; // Implemented in C/C++ to avoid GC transitions
56
- fpRelease = ( IntPtr ) ( delegate * unmanaged< IntPtr , uint > ) & ComWrappers . IUnknown_Release ;
56
+ fpRelease = ( IntPtr ) ( delegate * unmanaged[ MemberFunction ] < IntPtr , uint > ) & ComWrappers . IUnknown_Release ;
57
57
}
58
58
59
- [ UnmanagedCallersOnly ]
59
+ internal static unsafe void GetUntrackedIUnknownImpl ( out delegate * unmanaged[ MemberFunction ] < IntPtr , uint > fpAddRef , out delegate * unmanaged[ MemberFunction ] < IntPtr , uint > fpRelease )
60
+ {
61
+ // Implemented in C/C++ to avoid GC transitions during shutdown
62
+ fpAddRef = ( delegate * unmanaged[ MemberFunction ] < IntPtr , uint > ) ( void * ) ( delegate * < IntPtr , uint > ) & RuntimeImports . RhUntracked_AddRefRelease ;
63
+ fpRelease = ( delegate * unmanaged[ MemberFunction ] < IntPtr , uint > ) ( void * ) ( delegate * < IntPtr , uint > ) & RuntimeImports . RhUntracked_AddRefRelease ;
64
+ }
65
+
66
+ [ UnmanagedCallersOnly ( CallConvs = [ typeof ( CallConvMemberFunction ) ] ) ]
60
67
internal static unsafe int IUnknown_QueryInterface ( IntPtr pThis , Guid * guid , IntPtr * ppObject )
61
68
{
62
69
ManagedObjectWrapper * wrapper = ComInterfaceDispatch . ToManagedObjectWrapper ( ( ComInterfaceDispatch * ) pThis ) ;
63
70
return wrapper ->QueryInterface ( in * guid , out * ppObject ) ;
64
71
}
65
72
66
- [ UnmanagedCallersOnly ]
73
+ [ UnmanagedCallersOnly ( CallConvs = [ typeof ( CallConvMemberFunction ) ] ) ]
67
74
internal static unsafe uint IUnknown_Release ( IntPtr pThis )
68
75
{
69
76
ManagedObjectWrapper * wrapper = ComInterfaceDispatch . ToManagedObjectWrapper ( ( ComInterfaceDispatch * ) pThis ) ;
@@ -75,7 +82,7 @@ private static IntPtr GetTaggedImplCurrentVersion()
75
82
{
76
83
unsafe
77
84
{
78
- return ( IntPtr ) ( delegate * unmanaged< IntPtr , IntPtr , int > ) & VtableImplementations . ITaggedImpl_IsCurrentVersion ;
85
+ return ( IntPtr ) ( delegate * unmanaged[ MemberFunction ] < IntPtr , IntPtr , int > ) & VtableImplementations . ITaggedImpl_IsCurrentVersion ;
79
86
}
80
87
}
81
88
@@ -95,28 +102,28 @@ private static class VtableImplementations
95
102
{
96
103
public unsafe struct IUnknownVftbl
97
104
{
98
- public delegate * unmanaged< IntPtr , Guid * , IntPtr * , int > QueryInterface ;
99
- public delegate * unmanaged< IntPtr , int > AddRef ;
100
- public delegate * unmanaged< IntPtr , uint > Release ;
105
+ public delegate * unmanaged[ MemberFunction ] < IntPtr , Guid * , IntPtr * , int > QueryInterface ;
106
+ public delegate * unmanaged[ MemberFunction ] < IntPtr , int > AddRef ;
107
+ public delegate * unmanaged[ MemberFunction ] < IntPtr , uint > Release ;
101
108
}
102
109
103
110
public unsafe struct IReferenceTrackerTargetVftbl
104
111
{
105
- public delegate * unmanaged< IntPtr , Guid * , IntPtr * , int > QueryInterface ;
106
- public delegate * unmanaged< IntPtr , int > AddRef ;
107
- public delegate * unmanaged< IntPtr , uint > Release ;
108
- public delegate * unmanaged< IntPtr , uint > AddRefFromReferenceTracker ;
109
- public delegate * unmanaged< IntPtr , uint > ReleaseFromReferenceTracker ;
110
- public delegate * unmanaged< IntPtr , uint > Peg ;
111
- public delegate * unmanaged< IntPtr , uint > Unpeg ;
112
+ public delegate * unmanaged[ MemberFunction ] < IntPtr , Guid * , IntPtr * , int > QueryInterface ;
113
+ public delegate * unmanaged[ MemberFunction ] < IntPtr , int > AddRef ;
114
+ public delegate * unmanaged[ MemberFunction ] < IntPtr , uint > Release ;
115
+ public delegate * unmanaged[ MemberFunction ] < IntPtr , uint > AddRefFromReferenceTracker ;
116
+ public delegate * unmanaged[ MemberFunction ] < IntPtr , uint > ReleaseFromReferenceTracker ;
117
+ public delegate * unmanaged[ MemberFunction ] < IntPtr , uint > Peg ;
118
+ public delegate * unmanaged[ MemberFunction ] < IntPtr , uint > Unpeg ;
112
119
}
113
120
114
121
public unsafe struct ITaggedImplVftbl
115
122
{
116
- public delegate * unmanaged< IntPtr , Guid * , IntPtr * , int > QueryInterface ;
117
- public delegate * unmanaged< IntPtr , int > AddRef ;
118
- public delegate * unmanaged< IntPtr , uint > Release ;
119
- public delegate * unmanaged< IntPtr , IntPtr , int > IsCurrentVersion ;
123
+ public delegate * unmanaged[ MemberFunction ] < IntPtr , Guid * , IntPtr * , int > QueryInterface ;
124
+ public delegate * unmanaged[ MemberFunction ] < IntPtr , int > AddRef ;
125
+ public delegate * unmanaged[ MemberFunction ] < IntPtr , uint > Release ;
126
+ public delegate * unmanaged[ MemberFunction ] < IntPtr , IntPtr , int > IsCurrentVersion ;
120
127
}
121
128
122
129
[ FixedAddressValueType ]
@@ -128,45 +135,45 @@ public unsafe struct ITaggedImplVftbl
128
135
[ FixedAddressValueType ]
129
136
public static readonly ITaggedImplVftbl ITaggedImpl ;
130
137
131
- [ UnmanagedCallersOnly ]
138
+ [ UnmanagedCallersOnly ( CallConvs = [ typeof ( CallConvMemberFunction ) ] ) ]
132
139
internal static unsafe int IReferenceTrackerTarget_QueryInterface ( IntPtr pThis , Guid * guid , IntPtr * ppObject )
133
140
{
134
141
ManagedObjectWrapper * wrapper = ComInterfaceDispatch . ToManagedObjectWrapper ( ( ComInterfaceDispatch * ) pThis ) ;
135
142
return wrapper ->QueryInterfaceForTracker ( in * guid , out * ppObject ) ;
136
143
}
137
144
138
- [ UnmanagedCallersOnly ]
145
+ [ UnmanagedCallersOnly ( CallConvs = [ typeof ( CallConvMemberFunction ) ] ) ]
139
146
internal static unsafe uint IReferenceTrackerTarget_AddRefFromReferenceTracker ( IntPtr pThis )
140
147
{
141
148
ManagedObjectWrapper * wrapper = ComInterfaceDispatch . ToManagedObjectWrapper ( ( ComInterfaceDispatch * ) pThis ) ;
142
149
return wrapper ->AddRefFromReferenceTracker ( ) ;
143
150
}
144
151
145
- [ UnmanagedCallersOnly ]
152
+ [ UnmanagedCallersOnly ( CallConvs = [ typeof ( CallConvMemberFunction ) ] ) ]
146
153
internal static unsafe uint IReferenceTrackerTarget_ReleaseFromReferenceTracker ( IntPtr pThis )
147
154
{
148
155
ManagedObjectWrapper * wrapper = ComInterfaceDispatch . ToManagedObjectWrapper ( ( ComInterfaceDispatch * ) pThis ) ;
149
156
return wrapper ->ReleaseFromReferenceTracker ( ) ;
150
157
}
151
158
152
- [ UnmanagedCallersOnly ]
159
+ [ UnmanagedCallersOnly ( CallConvs = [ typeof ( CallConvMemberFunction ) ] ) ]
153
160
internal static unsafe uint IReferenceTrackerTarget_Peg ( IntPtr pThis )
154
161
{
155
162
ManagedObjectWrapper * wrapper = ComInterfaceDispatch . ToManagedObjectWrapper ( ( ComInterfaceDispatch * ) pThis ) ;
156
163
return wrapper ->Peg ( ) ;
157
164
}
158
165
159
- [ UnmanagedCallersOnly ]
166
+ [ UnmanagedCallersOnly ( CallConvs = [ typeof ( CallConvMemberFunction ) ] ) ]
160
167
internal static unsafe uint IReferenceTrackerTarget_Unpeg ( IntPtr pThis )
161
168
{
162
169
ManagedObjectWrapper * wrapper = ComInterfaceDispatch . ToManagedObjectWrapper ( ( ComInterfaceDispatch * ) pThis ) ;
163
170
return wrapper ->Unpeg ( ) ;
164
171
}
165
172
166
- [ UnmanagedCallersOnly ]
173
+ [ UnmanagedCallersOnly ( CallConvs = [ typeof ( CallConvMemberFunction ) ] ) ]
167
174
internal static unsafe int ITaggedImpl_IsCurrentVersion ( IntPtr pThis , IntPtr version )
168
175
{
169
- return version == ( IntPtr ) ( delegate * unmanaged< IntPtr , IntPtr , int > ) & ITaggedImpl_IsCurrentVersion
176
+ return version == ( IntPtr ) ( delegate * unmanaged[ MemberFunction ] < IntPtr , IntPtr , int > ) & ITaggedImpl_IsCurrentVersion
170
177
? HResults . S_OK
171
178
: HResults . E_FAIL ;
172
179
}
@@ -179,21 +186,21 @@ static unsafe VtableImplementations()
179
186
fpAddRef: out * ( nint * ) & ( ( IUnknownVftbl * ) Unsafe . AsPointer ( ref IUnknown ) ) ->AddRef ,
180
187
fpRelease: out * ( nint * ) & ( ( IUnknownVftbl * ) Unsafe . AsPointer ( ref IUnknown ) ) ->Release ) ;
181
188
182
- IReferenceTrackerTarget. QueryInterface = ( delegate * unmanaged< IntPtr , Guid * , IntPtr * , int > ) & IReferenceTrackerTarget_QueryInterface ;
189
+ IReferenceTrackerTarget. QueryInterface = ( delegate * unmanaged[ MemberFunction ] < IntPtr , Guid * , IntPtr * , int > ) & IReferenceTrackerTarget_QueryInterface ;
183
190
GetIUnknownImpl(
184
191
fpQueryInterface : out _ ,
185
192
fpAddRef : out * ( nint * ) & ( ( IReferenceTrackerTargetVftbl * ) Unsafe . AsPointer ( ref IReferenceTrackerTarget ) ) ->AddRef ,
186
193
fpRelease: out * ( nint * ) & ( ( IReferenceTrackerTargetVftbl * ) Unsafe . AsPointer ( ref IReferenceTrackerTarget ) ) ->Release ) ;
187
- IReferenceTrackerTarget. AddRefFromReferenceTracker = ( delegate * unmanaged< IntPtr , uint > ) & IReferenceTrackerTarget_AddRefFromReferenceTracker ;
188
- IReferenceTrackerTarget. ReleaseFromReferenceTracker = ( delegate * unmanaged< IntPtr , uint > ) & IReferenceTrackerTarget_ReleaseFromReferenceTracker ;
189
- IReferenceTrackerTarget. Peg = ( delegate * unmanaged< IntPtr , uint > ) & IReferenceTrackerTarget_Peg ;
190
- IReferenceTrackerTarget. Unpeg = ( delegate * unmanaged< IntPtr , uint > ) & IReferenceTrackerTarget_Unpeg ;
194
+ IReferenceTrackerTarget. AddRefFromReferenceTracker = ( delegate * unmanaged[ MemberFunction ] < IntPtr , uint > ) & IReferenceTrackerTarget_AddRefFromReferenceTracker ;
195
+ IReferenceTrackerTarget. ReleaseFromReferenceTracker = ( delegate * unmanaged[ MemberFunction ] < IntPtr , uint > ) & IReferenceTrackerTarget_ReleaseFromReferenceTracker ;
196
+ IReferenceTrackerTarget. Peg = ( delegate * unmanaged[ MemberFunction ] < IntPtr , uint > ) & IReferenceTrackerTarget_Peg ;
197
+ IReferenceTrackerTarget. Unpeg = ( delegate * unmanaged[ MemberFunction ] < IntPtr , uint > ) & IReferenceTrackerTarget_Unpeg ;
191
198
192
199
GetIUnknownImpl(
193
200
fpQueryInterface : out * ( nint * ) & ( ( ITaggedImplVftbl * ) Unsafe . AsPointer ( ref ITaggedImpl ) ) ->QueryInterface ,
194
201
fpAddRef: out * ( nint * ) & ( ( ITaggedImplVftbl * ) Unsafe . AsPointer ( ref ITaggedImpl ) ) ->AddRef ,
195
202
fpRelease: out * ( nint * ) & ( ( ITaggedImplVftbl * ) Unsafe . AsPointer ( ref ITaggedImpl ) ) ->Release ) ;
196
- ITaggedImpl. IsCurrentVersion = ( delegate * unmanaged< IntPtr , IntPtr , int > ) & ITaggedImpl_IsCurrentVersion ;
203
+ ITaggedImpl. IsCurrentVersion = ( delegate * unmanaged[ MemberFunction ] < IntPtr , IntPtr , int > ) & ITaggedImpl_IsCurrentVersion ;
197
204
}
198
205
}
199
206
}
0 commit comments