Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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#_.net_Wpf_Prism_Mef - Fatal编程技术网

C# 使用MEF将程序集添加到目录

C# 使用MEF将程序集添加到目录,c#,.net,wpf,prism,mef,C#,.net,Wpf,Prism,Mef,有一个相当大的项目,其中有近十几个程序集添加到shell中,其他程序集通过config添加 试图找到更好的方法来添加项目中引用的程序集 到目前为止,代码是这样的 Dictionary<string,string> dict = new Dictionary<string,string>(); // to avoid duplicate parts foreach (Assembly an in AppDomain.CurrentDomain.GetAssemblies

有一个相当大的项目,其中有近十几个程序集添加到shell中,其他程序集通过config添加

试图找到更好的方法来添加项目中引用的程序集

到目前为止,代码是这样的

 Dictionary<string,string> dict = new Dictionary<string,string>(); // to avoid duplicate parts
 foreach (Assembly an in AppDomain.CurrentDomain.GetAssemblies())
            addAssembly(an, dict);

 foreach (AssemblyName an in Assembly.GetEntryAssembly().GetReferencedAssemblies())
            addAssembly(an, dict);

 foreach (AssemblyName an in GetAsmInConfig())
            addAssembly(an, dict);
Dictionary dict=new Dictionary();//避免重复零件
foreach(AppDomain.CurrentDomain.GetAssemblys()中的程序集)
addAssembly(an,dict);
foreach(Assembly.GetEntryAssembly().GetReferencedAssemblys()中的AssemblyName)
addAssembly(an,dict);
foreach(GetAsmInConfig()中的AssemblyName an)
addAssembly(an,dict);
即使如此,并非所有在设计时引用到Shell的部件都添加到目录中

想知道除了将所有程序集添加到配置中之外还有什么其他方法可以实现这一目的吗

更新

  void addAssembly(Assembly a, Dictionary<string, string> dict)
    {
        if (a.IsDynamic || dict.ContainsKey(a.FullName))
            return;

        dict.Add(a.FullName, a.FullName);
        AggregateCatalog.Catalogs.Add(new AssemblyCatalog(a));        
    }
void addAssembly(程序集a,字典dict)
{
if(a.IsDynamic | | dict.ContainsKey(a.FullName))
返回;
dict.Add(a.FullName,a.FullName);
AggregateCatalog.Catalogs.Add(新组装目录(a));
}

据我所知,您正试图在字典中获取所有程序集(来自appdomain,由条目assembly引用并在配置文件中),然后将其提供给MEF,以便它在这些程序集中查找零件

我不使用它,而是为CompositionContainer提供AggregateCatalog。然后我将创建目录目录并提供所述程序集(dll)所在的文件夹

这些可能是项目的bin文件夹,其中应该已经包含大多数DLL,以及您需要的任何其他文件夹(配置文件中当前指定的程序集所在的文件夹)

更好的是,我会在我的bin文件夹中创建一个/plugin或/parts目录。使用生成后事件(在项目属性中),我将复制我所需的所有DLL,这些DLL用于我的bin文件夹中尚未包含的部件。然后我会这样做:

var aggregateCatalog = new AggregateCatalog();

var mainDirectoryCatalog = new DirectoryCatalog(".");
var partsDirectoryCatalog = new DirectoryCatalog("./parts");

aggregateCatalog.Catalogs.Add(mainDirectoryCatalog);
aggregateCatalog.Catalogs.Add(partsDirectoryCatalog);

如果将此aggregateCatalog提供给CompositionContainer,则将扫描这两个目录中的所有DLL以查找部件。由于条目程序集及其引用的程序集已在bin中,因此将获取这些程序集。其余的程序集将被复制到零件目录中。

编译器将删除未实际使用的引用,因此您不能将其作为枚举程序集的机制。 你的选择是:

  • 使用配置文件
  • 使用目录目录

  • 如果我理解正确,您在包含MEF零件的配置文件中定义了一些程序集,在项目中引用的其他程序集也包含MEF零件。您正在尝试为CompositionContainer构建目录,以便包含来自两个源的所有零件。目前,某些零件未在目录中结束。您需要在多个部件中查找零件吗?addAssembly方法的具体功能是什么?您可以发布代码吗?我正在尝试将设计时引用的部件添加到目录中,而无需在代码中显式添加它们,然后根据配置文件添加其他部件,并使用字典避免重复。我不久前遇到了一个问题,花了几天时间调试!!这当然是可行的,但我不能使用DirectoryCatalog,这就是我用代码编写字典以避免重复的原因之一为什么不能使用
    DirectoryCatalog
    ?@jberger说来话长,但简而言之,部件和版本是集中管理的,这就是为什么