Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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时,从其他程序集导入会引发异常_C#_Wpf_Import_Mef_Caliburn.micro - Fatal编程技术网

C# 使用MEF时,从其他程序集导入会引发异常

C# 使用MEF时,从其他程序集导入会引发异常,c#,wpf,import,mef,caliburn.micro,C#,Wpf,Import,Mef,Caliburn.micro,我有一个WPF项目,它需要从其他程序集导入 namespace DrawMe.Core.ViewModels { public class MenuBarViewModel : Conductor<IMenuBarItem> { [Import(typeof(IMenuBarItem))] public IMenuBarItem Item { get; set; } public MenuBarViewModel()

我有一个WPF项目,它需要从其他程序集导入

namespace DrawMe.Core.ViewModels
{
    public class MenuBarViewModel : Conductor<IMenuBarItem>
    {
        [Import(typeof(IMenuBarItem))]
        public IMenuBarItem Item { get; set; }

        public MenuBarViewModel()
        {
            MefInjector.Inject(this);     
        }
    }
}


namespace DrawMe.MenuBarItems.ViewModels
{
    [Export(typeof(IMenuBarItem))]
    public class FileViewModel : Screen, IMenuBarItem
    {
        public string Name { get; set; }
        public List<IMenuBarOption> Options { get; set; }


    }
}
我不明白这怎么可能。我发现的大多数信息都是关于不匹配的程序集版本的,但我有一个非常基本的解决方案,每个项目都有相同的版本

我尝试使用
惰性项
,但这会导入
null

此外,我还使用了
MefInjector
,因此我可以从
MainViewModel
以外的类进行导入

public static readonly string ExtensionFolderPath = Path.GetFullPath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\Extensions");
private static readonly DirectoryCatalog DirectoryCatalog = new DirectoryCatalog(ExtensionFolderPath);
private static readonly CompositionContainer Container = new CompositionContainer(DirectoryCatalog);

public static void Inject<T>(T obj) where T : class 
{
    Container.ComposeParts(obj);
}
public static readonly string ExtensionFolderPath=Path.GetFullPath(Path.GetDirectoryName(Assembly.getExecutionGassembly().Location)+“\\Extensions”);
私有静态只读目录DirectoryCatalog=newdirectorycatalog(ExtensionFolderPath);
私有静态只读CompositionContainer=新的CompositionContainer(DirectoryCatalog);
公共静态无效注入(T obj),其中T:class
{
集装箱组件(obj);
}
和引导者

protected override IEnumerable<Assembly> SelectAssemblies()
        {
            var assemblies = Directory.GetFiles(MefInjector.ExtensionFolderPath, "*.dll", SearchOption.AllDirectories).Select(Assembly.LoadFrom).ToList();
            assemblies.Add(Assembly.GetExecutingAssembly());
            return assemblies;
        }
受保护的重写IEnumerable SelectAssemblys()
{
var assemblies=Directory.GetFiles(mefinject.ExtensionFolderPath,“*.dll”,SearchOption.AllDirectories)。选择(Assembly.LoadFrom.ToList();
Add(Assembly.getExecutionGassembly());
返回组件;
}

有什么建议吗,我还可以尝试解决这个问题吗?

您是否在SelectAssemblys属性覆盖中告诉CM有关程序集的信息,只是在应用程序中引用程序集并不会告诉CM有关它的信息

受保护的重写IEnumerable SelectAssemblys()
{
var assemblies=base.SelectAssemblies();
var directory=newdirectoryinfo(AppDomain.CurrentDomain.BaseDirectory);
var files=directory.GetFiles(“*.dll”,SearchOption.TopDirectoryOnly);
var modules=files.Where(f=>f.Name.Contains(“SomeAssemblyNamespacePrefixorProjectName”))
.Select(f=>Assembly.LoadFile(f.FullName));
返回组件。Concat(模块);
}

您是否在SelectAssemblys属性覆盖中告诉CM有关程序集的信息,仅在应用程序中引用程序集不会告诉CM有关它的信息

受保护的重写IEnumerable SelectAssemblys()
{
var assemblies=base.SelectAssemblies();
var directory=newdirectoryinfo(AppDomain.CurrentDomain.BaseDirectory);
var files=directory.GetFiles(“*.dll”,SearchOption.TopDirectoryOnly);
var modules=files.Where(f=>f.Name.Contains(“SomeAssemblyNamespacePrefixorProjectName”))
.Select(f=>Assembly.LoadFile(f.FullName));
返回组件。Concat(模块);
}

所以,我想我把它修好了。老实说,我不知道出了什么问题。我刚刚删除了我的项目并创建了一个新项目。我用完全相同的方法做每件事,现在它起作用了。也许是程序集不匹配的问题,但考虑到我已多次清理文件夹,我真的不知道这怎么可能…

所以,我想我已经解决了它。老实说,我不知道出了什么问题。我刚刚删除了我的项目并创建了一个新项目。我用完全相同的方法做每件事,现在它起作用了。可能是程序集不匹配的问题,但考虑到我已多次清理文件夹,我真的不知道这怎么可能…

是的,我有,加载程序集是正确的。调试模块窗口时,我的每个程序集都在我的模块窗口中。是的,我有它并且加载程序集工作正常。调试模块窗口时,每个程序集都在其中。
protected override IEnumerable<Assembly> SelectAssemblies()
        {
            var assemblies = Directory.GetFiles(MefInjector.ExtensionFolderPath, "*.dll", SearchOption.AllDirectories).Select(Assembly.LoadFrom).ToList();
            assemblies.Add(Assembly.GetExecutingAssembly());
            return assemblies;
        }
protected override IEnumerable<Assembly> SelectAssemblies()
    {
        var assemblies = base.SelectAssemblies();

        var directory = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory);
        var files = directory.GetFiles("*.dll", SearchOption.TopDirectoryOnly);
        var modules = files.Where(f => f.Name.Contains("SomeAssemblyNamespacePrefixorProjectName"))
                                  .Select(f => Assembly.LoadFile(f.FullName));

        return assemblies.Concat(modules);

    }