Добавление сборок в каталог с помощью MEF - PullRequest
4 голосов
/ 11 марта 2012

Есть довольно большой проект с почти дюжиной сборок, добавленных в оболочку, и других сборок, добавленных через 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 во время разработки, добавляются в каталог

Хотите знать, есть ли что-нибудь, кроме добавления всех сборок в конфигурацию, которые помогут?

UPDATE

  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));        
    }

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

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

  1. использовать файл конфигурации
  2. использовать каталог каталога
2 голосов
/ 14 марта 2012

Из того, что я понимаю, вы пытаетесь получить все сборки (из appdomain, на которые ссылается сборка записей и в файле конфигурации) в словаре, а затем передать его в MEF, чтобы он искал детали в этих сборках.

Вместо этого я поставил бы свой CompositionContainer с AggregateCatalog. Затем я создал бы DirectoryCatalogs и предоставил бы папку, в которой находятся указанные сборки (dll).

Это может быть папка bin проекта, которая уже должна содержать большинство dll, а также любые другие необходимые вам папки (те, где находятся сборки, указанные в настоящее время в вашем файле конфигурации).

Еще лучше, я бы создал каталог / plugin или / parts в папке bin. С событиями после сборки (в свойствах проекта) я бы скопировал все необходимые мне библиотеки для частей, которых еще нет в папке 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 из обоих этих каталогов будут сканироваться на наличие деталей. Поскольку входная сборка и сборки, на которые она ссылается, уже находится в корзине, она получит их. Остальные сборки будут скопированы в каталог деталей.

...