Использование MEF с приложением веб-форм asp.net (SharePoint)

Я пытаюсь использовать MEF в своем приложении веб-формы ASP.NET (SharePoint) для загрузки некоторых элементов управления из каталога во время выполнения. Я не получаю никаких сообщений об ошибках, но элементы управления не загружаются.

Вот мой код -

aspx.cs

    public partial class SampleMEF : System.Web.UI.Page
    {
        [ImportMany(typeof(IControlLoader))]
        IEnumerable<Lazy<IControlLoader, IControlLoaderMetaData>> controls;
        private CompositionContainer _partsContainer;
        private AggregateCatalog _catalog;
        private string _partsPath;

        /// <summary>
        /// default constructor
        /// </summary>
        public SampleMEF()
        {
        }

        /// <summary>
        /// Initialize the page
        /// </summary>
        /// <param name="e"></param>
        protected override void OnInit(EventArgs e)
        {
            _partsPath = SPUtility.GetGenericSetupPath(@"TEMPLATE\LAYOUTS\MEFProtoType\Parts");
            _catalog = new AggregateCatalog();
            DirectoryCatalog c = new DirectoryCatalog(_partsPath, "*.dll");
            _partsContainer = new CompositionContainer(c);
            _partsContainer.ComposeParts(this);
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            foreach(Lazy<IControlLoader, IControlLoaderMetaData> i in controls)
            {
                SPPControl ctrl = i.Value.LoadControl();
                lbxControls.Items.Add(new ListItem(ctrl.Name, ctrl.ControlID.ToString()));
            }
        }
    }

Контракты

    /// <summary>
    /// Contract for Imports and Exports
    /// </summary>
    public interface IControlLoader
    {
        SPPControl LoadControl();
    }

    /// <summary>
    /// Exports metadata
    /// </summary>
    public interface IControlLoaderMetaData
    {
        string ControlID { get; }
    }

Образец экспорта

    [Export(typeof(IControlLoader))]
    [ExportMetadata("ControlID", "7a6c6288-ab52-4010-8c56-79959843ec7c")]
    public class ctrlAccordion : IControlLoader
    {
        #region IControlLoader Members

        public SPPControl LoadControl()
        {
            SPPControl ctrl = new SPPControl("Accordion", new Guid("7a6c6288-ab52-4010-8c56-79959843ec7c"), 5);
            return ctrl;
        }

        #endregion
    }

Я могу видеть скопированные библиотеки DLL в каталог частей. Но я не могу загрузить детали. Импорт не заполнен и пуст.

Я использую .Net Framework 3.5, скачал DLL MEF с MEF Codeplex и сам подписал сборку.

Любые идеи?


person NLV    schedule 02.06.2011    source источник


Ответы (2)


Хорошо, в конце концов я нашел проблему. Я могу загрузить библиотеки частей только в том случае, если я их подпишу и добавлю в глобальную сборку. Но я не понимаю, что DirectoryCatalog загружает папку.

Итог: если библиотеки DLL находятся только в папке частей, а не в GAC, они не загружаются.

person NLV    schedule 02.06.2011

Могут возникнуть проблемы при попытке загрузить сборки из произвольных мест. Раздел «Проблемы с загрузкой сборки» в в этом сообщении блога есть немного информации по этому поводу и ссылки на дополнительные сведения.

Вы также можете проверить каталог в отладчике, чтобы увидеть, загружены ли вообще какие-либо части.

person Daniel Plaisted    schedule 03.06.2011
comment
Да, именно так я отлаживал и проверял объект каталога. Он просто показывает загруженные файлы - 3, загруженные сборки - 0, части - 0. Фактически 3 загруженных файла являются действительными dll с экспортом в них. Но как только я подписал их и поместил в GAC, все заработало! - person NLV; 03.06.2011
comment
@NLV Можно также подписать их, не помещая в GAC. Присвоение сборке строгого имени (т. Е. Подписание) может предотвратить ее загрузку дважды. Если у вас была неподписанная библиотека MEF codeplex в вашей обычной папке bin, а также в папке частей, то, вероятно, загружались две копии MEF DLL, и атрибуты ExportAttrributes из ваших частей не были распознаны так же, как ExportAttributes вашего контейнера искал. - person Daniel Plaisted; 03.06.2011
comment
Неа. Просто подписывание dll не работает. Как только я удаляю dll из GAC, я не могу загружать части. А еще я просто использую подписанную dll MEF. - person NLV; 04.06.2011