public void CreateWrapperOfType_GenericHasNoWrapperWithInterfaces_ReturnsExpected() { var comObject = new ComImportObject(); object wrapper = Marshal.CreateWrapperOfType <ComImportObject, HasNonCOMInterfaces>(comObject); Assert.Same(wrapper, Marshal.GetComObjectData(comObject, typeof(HasNonCOMInterfaces))); }
public void CreateWrapperOfType_NonGenericHasNoWrapper_ReturnsExpected() { var comObject = new ComImportObject(); object wrapper = Marshal.CreateWrapperOfType(comObject, typeof(WrapperComImportObject)); Assert.Same(wrapper, Marshal.GetComObjectData(comObject, typeof(WrapperComImportObject))); }
public void CreateWrapperOfType_SameType_ReturnsSameInstance() { var comObject = new ComImportObject(); Assert.Same(comObject, Marshal.CreateWrapperOfType(comObject, typeof(ComImportObject))); Assert.Same(comObject, Marshal.CreateWrapperOfType <ComImportObject, ComImportObject>(comObject)); }
public void AddEventHandler_ComObjectWithMultipleComEventInterfaceAttribute_ThrowsAmbiguousMatchException() { // C# doesn't let us apply multiple ComEventInterface values, so RefEmit is necessary. AssemblyBuilder assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("assembly"), AssemblyBuilderAccess.Run); ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("module"); TypeBuilder typeBuilder = moduleBuilder.DefineType("name", TypeAttributes.Interface | TypeAttributes.Abstract); typeBuilder.SetCustomAttribute(new CustomAttributeBuilder(typeof(ComEventInterfaceAttribute).GetConstructors()[0], new object[] { typeof(int), typeof(string) })); typeBuilder.SetCustomAttribute(new CustomAttributeBuilder(typeof(ComEventInterfaceAttribute).GetConstructors()[0], new object[] { typeof(string), typeof(string) })); MethodBuilder addMethod = typeBuilder.DefineMethod("add_Event", MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.Abstract, typeof(void), new Type[] { typeof(EventHandler) }); addMethod.GetILGenerator().Emit(OpCodes.Ret); EventBuilder eventBuilder = typeBuilder.DefineEvent("Event", EventAttributes.None, typeof(EventHandler)); eventBuilder.SetAddOnMethod(addMethod); var attribute = new ComAwareEventInfo(typeBuilder.CreateType(), "Event"); var target = new ComImportObject(); Delegate handler = new EventHandler(EventHandler); Assert.Throws <AmbiguousMatchException>(() => attribute.AddEventHandler(target, handler)); Assert.Throws <AmbiguousMatchException>(() => attribute.RemoveEventHandler(target, handler)); }
public void CreateWrapperOfType_AlreadyHasWrapperOfBadType_ThrowsInvalidCastException() { var comObject = new ComImportObject(); Marshal.SetComObjectData(comObject, typeof(WrapperComImportObject), "data"); Assert.Throws <InvalidCastException>(() => Marshal.CreateWrapperOfType <ComImportObject, WrapperComImportObject>(comObject)); }
public void CreateWrapperOfType_AlreadyHasWrapper_ReturnsExpected() { var comObject = new ComImportObject(); Marshal.SetComObjectData(comObject, typeof(WrapperComImportObject), "data"); Assert.Same("data", Marshal.CreateWrapperOfType(comObject, typeof(WrapperComImportObject))); }
public void AddEventHandler_NullSourceTypeEventInterface_ThrowsNullReferenceException() { var attribute = new ComAwareEventInfo(typeof(NullSourceType), nameof(NullSourceType.Event)); var target = new ComImportObject(); Delegate handler = new EventHandler(EventHandler); Assert.Throws <NullReferenceException>(() => attribute.AddEventHandler(target, handler)); Assert.Throws <NullReferenceException>(() => attribute.RemoveEventHandler(target, handler)); }
public void AddEventHandler_ComObjectWithoutComEventInterfaceAttribute_ThrowsInvalidOperationException() { var attribute = new ComAwareEventInfo(typeof(NonComObject), nameof(NonComObject.Event)); var target = new ComImportObject(); Delegate handler = new EventHandler(EventHandler); Assert.Throws <InvalidOperationException>(() => attribute.AddEventHandler(target, handler)); Assert.Throws <InvalidOperationException>(() => attribute.RemoveEventHandler(target, handler)); }
public void AddEventHandler_TargetNotIConnectionIConnectionPointContainer_ThrowsInvalidCastException() { var attribute = new ComAwareEventInfo(typeof(DispAttributeInterface), nameof(DispAttributeInterface.Event)); var target = new ComImportObject(); Delegate handler = new EventHandler(EventHandler); Assert.Throws <InvalidCastException>(() => attribute.AddEventHandler(target, handler)); attribute.RemoveEventHandler(target, handler); }
public void AddEventHandler_NoSuchSourceTypeEventInterface_ThrowsArgumentNullException() { var attribute = new ComAwareEventInfo(typeof(NoSuchSourceType), nameof(NoSuchSourceType.Event)); var target = new ComImportObject(); Delegate handler = new EventHandler(EventHandler); AssertExtensions.Throws <ArgumentNullException>("element", () => attribute.AddEventHandler(target, handler)); AssertExtensions.Throws <ArgumentNullException>("element", () => attribute.RemoveEventHandler(target, handler)); }
public void GetComObjectData_ValidObject_ReturnsExpected() { var comObject = new ComImportObject(); Assert.Null(Marshal.GetComObjectData(comObject, "key")); Marshal.SetComObjectData(comObject, "key", 1); Assert.Equal(1, Marshal.GetComObjectData(comObject, "key")); Assert.Null(Marshal.GetComObjectData(comObject, "noSuchKey")); }
public void SetComObjectData_NonNullValue_Sucesss() { var comObject = new ComImportObject(); Assert.True(Marshal.SetComObjectData(comObject, "key", 1)); Assert.Equal(1, Marshal.GetComObjectData(comObject, "key")); Assert.False(Marshal.SetComObjectData(comObject, "key", 2)); Assert.Equal(1, Marshal.GetComObjectData(comObject, "key")); Assert.True(Marshal.SetComObjectData(comObject, "otherKey", 2)); Assert.Equal(2, Marshal.GetComObjectData(comObject, "otherKey")); }
public static IEnumerable <object[]> GetNativeVariantForObject_WrappedComObject_TestData() { var empty = new ComImportObject(); var dual = new DualComObject(); var iUnknown = new IUnknownComObject(); var iDispatch = new IDispatchComObject(); var iInspectable = new IInspectableComObject(); var nonDual = new NonDualComObject(); var autoDispatch = new AutoDispatchComObject(); var autoDual = new AutoDualComObject(); yield return(new object[] { new UnknownWrapper(empty), empty, VarEnum.VT_UNKNOWN }); yield return(new object[] { new UnknownWrapper(dual), dual, VarEnum.VT_UNKNOWN }); yield return(new object[] { new UnknownWrapper(iUnknown), iUnknown, VarEnum.VT_UNKNOWN }); yield return(new object[] { new UnknownWrapper(iDispatch), iDispatch, VarEnum.VT_UNKNOWN }); yield return(new object[] { new UnknownWrapper(iInspectable), iInspectable, VarEnum.VT_UNKNOWN }); yield return(new object[] { new UnknownWrapper(nonDual), nonDual, VarEnum.VT_UNKNOWN }); yield return(new object[] { new UnknownWrapper(autoDispatch), autoDispatch, VarEnum.VT_UNKNOWN }); yield return(new object[] { new UnknownWrapper(autoDual), autoDual, VarEnum.VT_UNKNOWN }); if (!PlatformDetection.IsNetCore) { yield return(new object[] { new DispatchWrapper(empty), empty, VarEnum.VT_DISPATCH }); yield return(new object[] { new DispatchWrapper(dual), dual, VarEnum.VT_DISPATCH }); yield return(new object[] { new DispatchWrapper(iUnknown), iUnknown, VarEnum.VT_DISPATCH }); yield return(new object[] { new DispatchWrapper(iDispatch), iDispatch, VarEnum.VT_DISPATCH }); yield return(new object[] { new DispatchWrapper(iInspectable), iInspectable, VarEnum.VT_DISPATCH }); yield return(new object[] { new DispatchWrapper(nonDual), nonDual, VarEnum.VT_DISPATCH }); yield return(new object[] { new DispatchWrapper(autoDispatch), autoDispatch, VarEnum.VT_DISPATCH }); yield return(new object[] { new DispatchWrapper(autoDual), autoDual, VarEnum.VT_DISPATCH }); } else { Assert.Throws <PlatformNotSupportedException>(() => new DispatchWrapper(10)); } }
public static IEnumerable <object[]> GetNativeVariantForObject_ComObjectArray_TestData() { // Arrays. var empty = new ComImportObject(); yield return(new object[] { new ComImportObject[] { empty, null }, (VarEnum)8205, new object[] { empty, null } }); var nonDualEmpty = new NonDualComObjectEmpty(); var autoDispatchEmpty = new AutoDispatchComObjectEmpty(); var autoDualEmpty = new AutoDualComObjectEmpty(); yield return(new object[] { new NonDualComObjectEmpty[] { nonDualEmpty, null }, (VarEnum)8205, new object[] { nonDualEmpty, null } }); yield return(new object[] { new AutoDispatchComObjectEmpty[] { autoDispatchEmpty, null }, (VarEnum)8205, new object[] { autoDispatchEmpty, null } }); yield return(new object[] { new AutoDualComObjectEmpty[] { autoDualEmpty, null }, (VarEnum)8205, new object[] { autoDualEmpty, null } }); }
public static IEnumerable <object[]> GetNativeVariantForObject_WrappedComObject_TestData() { var empty = new ComImportObject(); var dual = new DualComObject(); var iUnknown = new IUnknownComObject(); var iDispatch = new IDispatchComObject(); var iInspectable = new IInspectableComObject(); var nonDual = new NonDualComObject(); var autoDispatch = new AutoDispatchComObject(); var autoDual = new AutoDualComObject(); yield return(new object[] { new UnknownWrapper(empty), empty, VarEnum.VT_UNKNOWN }); yield return(new object[] { new UnknownWrapper(dual), dual, VarEnum.VT_UNKNOWN }); yield return(new object[] { new UnknownWrapper(iUnknown), iUnknown, VarEnum.VT_UNKNOWN }); yield return(new object[] { new UnknownWrapper(iDispatch), iDispatch, VarEnum.VT_UNKNOWN }); yield return(new object[] { new UnknownWrapper(iInspectable), iInspectable, VarEnum.VT_UNKNOWN }); yield return(new object[] { new UnknownWrapper(nonDual), nonDual, VarEnum.VT_UNKNOWN }); yield return(new object[] { new UnknownWrapper(autoDispatch), autoDispatch, VarEnum.VT_UNKNOWN }); yield return(new object[] { new UnknownWrapper(autoDual), autoDual, VarEnum.VT_UNKNOWN }); yield return(new object[] { new DispatchWrapper(empty), empty, VarEnum.VT_DISPATCH }); yield return(new object[] { new DispatchWrapper(dual), dual, VarEnum.VT_DISPATCH }); yield return(new object[] { new DispatchWrapper(iUnknown), iUnknown, VarEnum.VT_DISPATCH }); yield return(new object[] { new DispatchWrapper(iDispatch), iDispatch, VarEnum.VT_DISPATCH }); yield return(new object[] { new DispatchWrapper(iInspectable), iInspectable, VarEnum.VT_DISPATCH }); yield return(new object[] { new DispatchWrapper(nonDual), nonDual, VarEnum.VT_DISPATCH }); yield return(new object[] { new DispatchWrapper(autoDispatch), autoDispatch, VarEnum.VT_DISPATCH }); yield return(new object[] { new DispatchWrapper(autoDual), autoDual, VarEnum.VT_DISPATCH }); }
public void FinalReleaseComObject_ValidComObject_Success() { var comObject = new ComImportObject(); Assert.Equal(0, Marshal.FinalReleaseComObject(comObject)); }
public void CreateWrapperOfType_CantAssignInterfaces_ThrowsInvalidCastException() { var comObject = new ComImportObject(); Assert.Throws <InvalidCastException>(() => Marshal.CreateWrapperOfType(comObject, typeof(HasCOMInterfaces))); }