@@ -49,6 +49,7 @@ extern public static int UpdateTestObjectAsInterface(
49
49
50
50
private const string ManagedServerTypeName = "ConsumeNETServerTesting" ;
51
51
52
+ private const string IID_IUNKNOWN = "00000000-0000-0000-C000-000000000046" ;
52
53
private const string IID_IDISPATCH = "00020400-0000-0000-C000-000000000046" ;
53
54
private const string IID_IINSPECTABLE = "AF86E2E0-B12D-4c6a-9C5A-D7AA65101E90" ;
54
55
class TestEx : Test
@@ -278,7 +279,7 @@ private static void ValidateMarshalAPIs(bool validateUseRegistered)
278
279
var testObj = new Test ( ) ;
279
280
IntPtr comWrapper1 = Marshal . GetIUnknownForObject ( testObj ) ;
280
281
Assert . NotEqual ( IntPtr . Zero , comWrapper1 ) ;
281
- Assert . Equal ( testObj , registeredWrapper . LastComputeVtablesObject ) ;
282
+ Assert . Same ( testObj , registeredWrapper . LastComputeVtablesObject ) ;
282
283
283
284
IntPtr comWrapper2 = Marshal . GetIUnknownForObject ( testObj ) ;
284
285
Assert . Equal ( comWrapper1 , comWrapper2 ) ;
@@ -295,7 +296,7 @@ private static void ValidateMarshalAPIs(bool validateUseRegistered)
295
296
var dispatchObj = new TestEx ( IID_IDISPATCH ) ;
296
297
IntPtr dispatchWrapper = Marshal . GetIDispatchForObject ( dispatchObj ) ;
297
298
Assert . NotEqual ( IntPtr . Zero , dispatchWrapper ) ;
298
- Assert . Equal ( dispatchObj , registeredWrapper . LastComputeVtablesObject ) ;
299
+ Assert . Same ( dispatchObj , registeredWrapper . LastComputeVtablesObject ) ;
299
300
300
301
Console . WriteLine ( $ " -- Validate Marshal.GetIDispatchForObject != Marshal.GetIUnknownForObject...") ;
301
302
IntPtr unknownWrapper = Marshal . GetIUnknownForObject ( dispatchObj ) ;
@@ -309,7 +310,7 @@ private static void ValidateMarshalAPIs(bool validateUseRegistered)
309
310
object objWrapper1 = Marshal . GetObjectForIUnknown ( trackerObjRaw ) ;
310
311
Assert . Equal ( validateUseRegistered , objWrapper1 is FakeWrapper ) ;
311
312
object objWrapper2 = Marshal . GetObjectForIUnknown ( trackerObjRaw ) ;
312
- Assert . Equal ( objWrapper1 , objWrapper2 ) ;
313
+ Assert . Same ( objWrapper1 , objWrapper2 ) ;
313
314
314
315
Console . WriteLine ( $ " -- Validate Marshal.GetUniqueObjectForIUnknown...") ;
315
316
@@ -319,6 +320,29 @@ private static void ValidateMarshalAPIs(bool validateUseRegistered)
319
320
Assert . NotEqual ( objWrapper1 , objWrapper3 ) ;
320
321
321
322
Marshal . Release ( trackerObjRaw ) ;
323
+
324
+ if ( validateUseRegistered )
325
+ {
326
+ Console . WriteLine ( $ " -- Validate Marshal.GetObjectForIUnknown and Marshal.GetIUnknownForObject unwrapping...") ;
327
+ // Validate that the object returned by Marshal.GetObjectForIUnknown is the same as the original object passed to
328
+ // Marshal.GetIUnknownForObject.
329
+ IntPtr comWrapper3 = Marshal . GetIUnknownForObject ( testObj ) ;
330
+ object unwrappedObj = Marshal . GetObjectForIUnknown ( comWrapper3 ) ;
331
+ Assert . Same ( testObj , unwrappedObj ) ;
332
+
333
+ // Validate that the pointer returned by Marshal.GetIUnknownForObject is the same one that was passed into
334
+ // Marshal.GetObjectForIUnknown.
335
+ IntPtr trackerObj2 = MockReferenceTrackerRuntime . CreateTrackerObject ( ) ;
336
+ Marshal . ThrowExceptionForHR ( Marshal . QueryInterface ( trackerObj2 , Guid . Parse ( IID_IUNKNOWN ) , out IntPtr trackerObj2Identity ) ) ;
337
+ Marshal . Release ( trackerObj2 ) ;
338
+
339
+ object trackerObjectWrapper = Marshal . GetObjectForIUnknown ( trackerObj2 ) ;
340
+ IntPtr trackerObjUnwrapped = Marshal . GetIUnknownForObject ( trackerObjectWrapper ) ;
341
+ Assert . Equal ( trackerObj2Identity , trackerObjUnwrapped ) ;
342
+
343
+ Marshal . Release ( trackerObj2Identity ) ;
344
+ Marshal . Release ( trackerObjUnwrapped ) ;
345
+ }
322
346
}
323
347
324
348
private static void ValidatePInvokes ( bool validateUseRegistered )
@@ -362,12 +386,12 @@ private static void ValidateInterfaceMarshaler<T>(UpdateTestObject<T> func, bool
362
386
363
387
T retObj ;
364
388
int hr = func ( testObj as T , value , out retObj ) ;
365
- Assert . Equal ( testObj , GlobalComWrappers . Instance . LastComputeVtablesObject ) ;
389
+ Assert . Same ( testObj , GlobalComWrappers . Instance . LastComputeVtablesObject ) ;
366
390
if ( shouldSucceed )
367
391
{
368
392
Assert . True ( retObj is Test ) ;
369
393
Assert . Equal ( value , testObj . GetValue ( ) ) ;
370
- Assert . Equal < object > ( testObj , retObj ) ;
394
+ Assert . Same ( testObj , retObj ) ;
371
395
}
372
396
else
373
397
{
0 commit comments