Пример #1
0
        public void CreateWrapperOfType_GenericHasNoWrapperWithInterfaces_ReturnsExpected()
        {
            var    comObject = new ComImportObject();
            object wrapper   = Marshal.CreateWrapperOfType <ComImportObject, HasNonCOMInterfaces>(comObject);

            Assert.Same(wrapper, Marshal.GetComObjectData(comObject, typeof(HasNonCOMInterfaces)));
        }
Пример #2
0
        public void CreateWrapperOfType_NonGenericHasNoWrapper_ReturnsExpected()
        {
            var    comObject = new ComImportObject();
            object wrapper   = Marshal.CreateWrapperOfType(comObject, typeof(WrapperComImportObject));

            Assert.Same(wrapper, Marshal.GetComObjectData(comObject, typeof(WrapperComImportObject)));
        }
Пример #3
0
        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));
        }
Пример #5
0
        public void CreateWrapperOfType_AlreadyHasWrapperOfBadType_ThrowsInvalidCastException()
        {
            var comObject = new ComImportObject();

            Marshal.SetComObjectData(comObject, typeof(WrapperComImportObject), "data");

            Assert.Throws <InvalidCastException>(() => Marshal.CreateWrapperOfType <ComImportObject, WrapperComImportObject>(comObject));
        }
Пример #6
0
        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"));
        }
Пример #12
0
        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"));
        }
Пример #13
0
        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 });
        }
Пример #16
0
        public void FinalReleaseComObject_ValidComObject_Success()
        {
            var comObject = new ComImportObject();

            Assert.Equal(0, Marshal.FinalReleaseComObject(comObject));
        }
Пример #17
0
        public void CreateWrapperOfType_CantAssignInterfaces_ThrowsInvalidCastException()
        {
            var comObject = new ComImportObject();

            Assert.Throws <InvalidCastException>(() => Marshal.CreateWrapperOfType(comObject, typeof(HasCOMInterfaces)));
        }