Пример #1
0
        private PluginAssembly RegisterAssembly(FileInfo assemblyFilePath, Assembly assembly, IEnumerable <Type> pluginTypes)
        {
            // Get the isolation mode of the first attribute
            var firstType = Reflection.GetAttributes(pluginTypes, typeof(CrmPluginRegistrationAttribute).Name).FirstOrDefault();

            if (firstType == null)
            {
                return(null);
            }
            var firstTypeAttribute = firstType.CreateFromData() as CrmPluginRegistrationAttribute;

            // Is there any steps to register?
            if (firstTypeAttribute == null)
            {
                return(null);
            }
            var assemblyProperties = assembly.GetName().FullName.Split(",= ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
            var assemblyName       = assembly.GetName().Name;
            // If found then register or update it
            var plugin = (from p in _ctx.CreateQuery <PluginAssembly>()
                          where p.Name == assemblyName
                          select new PluginAssembly
            {
                Id = p.Id,
                Name = p.Name
            }).FirstOrDefault();

            string assemblyBase64 = Convert.ToBase64String(File.ReadAllBytes(assemblyFilePath.FullName));

            if (plugin == null)
            {
                plugin = new PluginAssembly();
            }

            // update
            plugin.Content        = assemblyBase64;
            plugin.Name           = assemblyProperties[0];
            plugin.Culture        = assemblyProperties[4];
            plugin.Version        = assemblyProperties[2];
            plugin.PublicKeyToken = assemblyProperties[6];
            plugin.SourceType     = pluginassembly_sourcetype.Database;                                                                                                       // database
            plugin.IsolationMode  = firstTypeAttribute.IsolationMode == IsolationModeEnum.Sandbox ? pluginassembly_isolationmode.Sandbox : pluginassembly_isolationmode.None; // 1= none, 2 = sandbox

            // Want to overwrite all existing plugin informaiton
            if (plugin.Id != Guid.Empty)
            {
                // Remove the existing plugin, because the schema might have changed
                _trace.WriteLine("Removing Plugin '{0}' from '{1}'", plugin.Name, assemblyFilePath.FullName);
                //_trace.WriteLine(PluginAssembly.EntityLogicalName);
                DeletePluginAssembly(plugin);
            }
            _trace.WriteLine("Registering Plugin '{0}' from '{1}'", plugin.Name, assemblyFilePath.FullName);
            // Create
            plugin.Id = _service.Create(plugin);

            // Add to solution
            if (SolutionUniqueName != null)
            {
                _trace.WriteLine("Adding Plugin '{0}' to solution '{1}'", plugin.Name, SolutionUniqueName);
                AddAssemblyToSolution(SolutionUniqueName, plugin);
            }
            return(plugin);
        }