Ejemplo n.º 1
0
        public IEnumerable <Type> GenerateProxys(IEnumerable <Type> interfaceTypes)
        {
            var assembles = DependencyContext.Default.RuntimeLibraries
                            .SelectMany(i => i.GetDefaultAssemblyNames(DependencyContext.Default)
                                        .Select(z => Assembly.Load(new AssemblyName(z.Name))));

            assembles = assembles.Where(i => i.IsDynamic == false).ToArray();

            var enumerable = interfaceTypes as Type[] ?? interfaceTypes.ToArray();
            var trees      = enumerable.Select(GenerateProxyTree).ToList();
            var stream     = CompilationUnits.CompileClientProxy(trees,
                                                                 assembles
                                                                 .Select(a => MetadataReference.CreateFromFile(a.Location))
                                                                 .Concat(new[]
            {
                MetadataReference.CreateFromFile(typeof(Task).GetTypeInfo().Assembly.Location)
            }),
                                                                 enumerable.ToArray()[0],
                                                                 _logger);

            if (stream == null)
            {
                throw new ArgumentException(@"没有生成任何客户端代码", nameof(stream));
            }

            using (stream)
            {
                var className = enumerable.ToArray()[0].Name.StartsWith("I")
                    ? enumerable.ToArray()[0].Name.Substring(1)
                    : enumerable.ToArray()[0].Name;
                return(AppDomain.CurrentDomain.GetAssemblies().Any(x => x.FullName.Contains(className))
                    ? Assembly.Load(StreamToBytes(stream)).GetExportedTypes()
                    : AssemblyLoadContext.Default.LoadFromStream(stream).GetExportedTypes());
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 生成服务代理
        /// </summary>
        /// <param name="interfaceTypes">需要被代理的接口类型</param>
        /// <returns>服务代理实现</returns>
        public IEnumerable <Type> GenerateProxys(IEnumerable <Type> interfaceTypes)
        {
//            var assembles = DependencyContext.Default.RuntimeLibraries
//                .SelectMany(i => i.GetDefaultAssemblyNames(DependencyContext.Default)
//                    .Select(z => Assembly.Load(new AssemblyName(z.Name))));

            var assembles = AppDomain.CurrentDomain.GetAssemblies().AsParallel().Where(i => i.IsDynamic == false).ToArray();

//            assembles = assembles.Where(i => i.IsDynamic == false).ToArray();

            var trees  = interfaceTypes.Select(GenerateProxyTree).ToList();
            var stream = CompilationUnits.CompileClientProxy(trees,
                                                             assembles
                                                             .Select(a => MetadataReference.CreateFromFile(a.Location))
                                                             .Concat(new[]
            {
                MetadataReference.CreateFromFile(typeof(Task).GetTypeInfo().Assembly.Location)
            }),
                                                             _logger);

            if (stream == null)
            {
                throw new ArgumentException("没有生成任何客户端代码", nameof(stream));
            }

            using (stream)
            {
                var assembly = AssemblyLoadContext.Default.LoadFromStream(stream);
                return(assembly.GetExportedTypes());
            }
        }
Ejemplo n.º 3
0
 private SourceInfo Act(params string[] sources) =>
 new SourceInfo(CompilationUnits.FromString(sources).ToList());
Ejemplo n.º 4
0
 private IReadOnlyCollection <PropertyInfo> Act(params string[] sources) =>
 new SourceInfo(CompilationUnits.FromString(sources).ToList())
 .Namespaces.First()
 .Classes.First()
 .Properties;
Ejemplo n.º 5
0
 private IReadOnlyCollection <StructInfo> Act(params string[] sources) =>
 new SourceInfo(CompilationUnits.FromString(sources).ToList())
 .Namespaces.First()
 .Structs;
Ejemplo n.º 6
0
 private NamespaceInfo Act(params string[] sources) =>
 new SourceInfo(CompilationUnits.FromString(sources).ToList())
 .Namespaces.First();