Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将MEF与asp.net web表单应用程序(SharePoint)一起使用_C#_Asp.net_Sharepoint_Mef - Fatal编程技术网

C# 将MEF与asp.net web表单应用程序(SharePoint)一起使用

C# 将MEF与asp.net web表单应用程序(SharePoint)一起使用,c#,asp.net,sharepoint,mef,C#,Asp.net,Sharepoint,Mef,我试图在ASP.NET web表单(SharePoint)应用程序中使用MEF在运行时从目录加载一些控件。我没有收到任何错误,但是控件没有加载 这是我的密码- aspx.cs public partial class SampleMEF : System.Web.UI.Page { [ImportMany(typeof(IControlLoader))] IEnumerable<Lazy<IControlLoader, IControl

我试图在ASP.NET web表单(SharePoint)应用程序中使用MEF在运行时从目录加载一些控件。我没有收到任何错误,但是控件没有加载

这是我的密码-

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; }
    }
我可以看到零件目录中复制的DLL。但是我不能装零件。导入未填充且为空

我使用的是.NETFramework3.5,从MEFcodeplex下载了MEFDLL,并亲自签署了程序集


有什么想法吗?

好吧,我终于找到了问题所在。只有在我对零件DLL进行签名并将其添加到全局装配时,我才能加载零件DLL。但我不明白
DirectoryCatalog
加载文件夹的作用


一句话:如果DLL仅在零件文件夹中,而不在GAC中,则不会加载它们。

尝试从任意位置加载程序集时可能会出现问题。的“程序集加载问题”部分有一些关于此问题的信息,并链接到更多信息


您还可以在调试器中检查目录,查看它是否加载了任何部件。

是的,我就是这样调试和检查目录对象的。它只显示加载的文件-3,加载的程序集-0,零件-0。加载的3个文件实际上是包含导出的有效DLL。但一旦我签了名并把它放进GAC,它就成功了@NLV在没有将其纳入GAC的情况下签署这些协议也可能有效。为程序集指定强名称(即对其签名)可以防止它被加载两次。如果您的普通bin文件夹和parts文件夹中都有未签名的codeplex MEF DLL,则可能正在加载MEF DLL的两个副本,并且您的parts中的ExportAttributes无法识别为与容器正在查找的ExportAttributes相同。否。仅对DLL进行签名不起作用。一旦我从GAC中删除dll,我就无法加载部件。而且我只是在使用签名的MEF dll。
    [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
    }