public BaseActivationFactory(string typeNamespace, string typeFullName)
        {
            var runtimeClassId = TypeExtensions.RemoveNamespacePrefix(typeFullName);

            // Prefer the RoGetActivationFactory HRESULT failure over the LoadLibrary/etc. failure
            int hr;

            (_IActivationFactory, hr) = WinrtModule.GetActivationFactory(runtimeClassId);
            if (_IActivationFactory != null)
            {
                return;
            }

            var moduleName = typeNamespace;

            while (true)
            {
                try
                {
                    (_IActivationFactory, _) = DllModule.Load(moduleName + ".dll").GetActivationFactory(runtimeClassId);
                    if (_IActivationFactory != null)
                    {
                        return;
                    }
                }
                catch (Exception) { }

                var lastSegment = moduleName.LastIndexOf(".");
                if (lastSegment <= 0)
                {
                    Marshal.ThrowExceptionForHR(hr);
                }
                moduleName = moduleName.Remove(lastSegment);
            }
        }
Beispiel #2
0
        public static string GetSignature(Type type)
        {
            var helperType = type.FindHelperType();

            if (helperType != null)
            {
                var sigMethod = helperType.GetMethod("GetGuidSignature", BindingFlags.Static | BindingFlags.Public);
                if (sigMethod != null)
                {
                    return((string)sigMethod.Invoke(null, new Type[] { }));
                }
            }

            if (type == typeof(object))
            {
                return("cinterface(IInspectable)");
            }

            if (type.IsGenericType)
            {
                var args = type.GetGenericArguments().Select(t => GetSignature(t));
                return("pinterface({" + GetGUID(type) + "};" + String.Join(";", args) + ")");
            }

            if (type.IsValueType)
            {
                switch (type.Name)
                {
                case "SByte": return("i1");

                case "Byte": return("u1");

                case "Int16": return("i2");

                case "UInt16": return("u2");

                case "Int32": return("i4");

                case "UInt32": return("u4");

                case "Int64": return("i8");

                case "UInt64": return("u8");

                case "Single": return("f4");

                case "Double": return("f8");

                case "Boolean": return("b1");

                case "Char": return("c2");

                case "Guid": return("g16");

                default:
                {
                    if (type.IsEnum)
                    {
                        var isFlags = type.CustomAttributes.Any(cad => cad.AttributeType == typeof(FlagsAttribute));
                        return("enum(" + TypeExtensions.RemoveNamespacePrefix(type.FullName) + ";" + (isFlags ? "u4" : "i4") + ")");
                    }
                    if (!type.IsPrimitive)
                    {
                        var args = type.GetFields(BindingFlags.Instance | BindingFlags.Public).Select(fi => GetSignature(fi.FieldType));
                        return("struct(" + TypeExtensions.RemoveNamespacePrefix(type.FullName) + ";" + String.Join(";", args) + ")");
                    }
                    throw new InvalidOperationException("unsupported value type");
                }
                }
            }

            if (type == typeof(string))
            {
                return("string");
            }

            if (Projections.TryGetDefaultInterfaceTypeForRuntimeClassType(type, out Type iface))
            {
                return("rc(" + TypeExtensions.RemoveNamespacePrefix(type.FullName) + ";" + GetSignature(iface) + ")");
            }

            if (type.IsDelegate())
            {
                return("delegate({" + GetGUID(type) + "})");
            }

            return("{" + type.GUID.ToString() + "}");
        }