有一个相当大的项目,其中有近十几个程序集添加到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);
即便如此,并非所有在设计时引用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));
}
答案 0 :(得分:2)
根据我的理解,你试图在字典中获取所有程序集(来自appdomain,由条目程序集和配置文件引用),然后将其提供给MEF,以便它在这些程序集中查找部件。
我将为CompositionContainer提供AggregateCatalog,而不是使用它。然后我将创建DirectoryCatalogs并提供所述程序集(dll)所在的文件夹。
这些可能是项目的bin文件夹,它应该已经包含大多数dll,以及您需要的任何其他文件夹(当前在配置文件中指定的程序集所在的文件夹)。
更好的是,我会在bin文件夹中创建/ plugin或/ parts目录。使用post-build事件(在项目属性中),我会复制我所需的所有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中,因此它将获得这些程序集。其余的程序集将复制到parts目录中。
答案 1 :(得分:2)
编译器将删除对实际未使用的引用,因此您不能将此作为枚举程序集的机制。 您的选择是: