Подтвердить что ты не робот

Части MEF не найдены для развернутого приложения, но найдены в режиме отладки

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

У меня есть приложение WPF для рабочего стола, которое я развертываю с помощью AdvancedInstaller. Я использую .NET 4.0 и MEF для компоновки деталей. Некоторые части находятся в основном проекте, поэтому они находятся в файле app.exe. Другие части находятся внутри библиотек классов, которые ссылаются на основной проект, поэтому они находятся внутри файлов somename.dll.

Проблема: При запуске приложения из VS, как в Debug, так и в Release, все в порядке. После развертывания приложения некоторые из DLL говорят, что у них нет частей (ноль) для экспорта.

Я проверил следующее:

  • все DLL доступны в развертывании, и каталог находит файлы
  • типы и имена экспорта верны, ведь все работает в Visual Studio
  • Когда я пытаюсь добавить части из DLL, я понимаю, что количество частей равно нулю ТОЛЬКО В РАЗВЕРТЫВАНИИ.

Это код, который не находит части в развернутом приложении:

var catalog = new AggregateCatalog();
string path = Environment.CurrentDirectory.ToString();
DirectoryCatalog qualitycontrol = new DirectoryCatalog(".", "QualityControl.exe"); //this is my main assembly
DirectoryCatalog qualitymix;

catalog.Catalogs.Add(qualitycontrol); //this finds the parts and always works fine

if (File.Exists(path + @"\QualityMix.dll"))
{
    qualitymix = new DirectoryCatalog(".", "QualityMix.dll"); //the file exists in the deployment
    catalog.Catalogs.Add(qualitymix); //the "qualitymix" catalog shows more than 20 parts if run with VS, but 0 parts in deployment
}

Единственное, что работает (но очень медленно запускать приложение), это следующее:

var catalog = new DirectoryCatalog(".", "*");

У этой проблемы есть необходимость проверки более 100 файлов, присутствующих в рабочем каталоге, и я не могу развернуть свои плагины для плагинов в другом каталоге.

Почему каталог DirectoryCatalog, просматривающий все файлы, находит детали, но DirectoryCatalog, смотрящий на одну часть, не работает? Как я могу отладить эту проблему, если это происходит только в развернутом приложении?

--- Изменить: эта проблема происходит только с некоторыми DLL, файлы найдены, а для других dll детали также найдены. Я использую ту же процедуру Export/Import во всех DLL, но некоторые из них не показывают частей в развертывании

Все, что вы можете предложить, будет полезно, спасибо вам, ребята!


НОВАЯ ИНФОРМАЦИЯ!

Я попробовал загрузить мою dll с помощью AssemblyCatalog. Он работает в Visual Studio (Debug and Release), но при развертывании я получаю следующие ошибки:

Первая попытка:

if (File.Exists(path + @"\QualityMix.dll"))
    {                           
        qualitymix = new AssemblyCatalog(Assembly.LoadFile(path + @"\QualityMix.dll")); //file is loaded and parts found in VS

         catalog.Catalogs.Add(qualitymix);
    }

Ошибка: ожидается, что модуль будет содержать манифест сборки. (Исключение из HRESULT: 0x80131018).

Вторая попытка:

 if (File.Exists(path + @"\QualityMix.dll"))
    {
        var name = AssemblyName.GetAssemblyName(path + @"\QualityMix.dll");
        qualitymix = new AssemblyCatalog(Assembly.Load(name));

        catalog.Catalogs.Add(qualitymix);
    }

Ошибка: не удалось загрузить файл или сборку "QualityMix.dll" или одну из его зависимостей. Была сделана попытка загрузить программу с неправильным форматом.

Я искал вопросы об этих ошибках, но пока ничего не было полезно. Все проекты построены для всех процессоров, и ссылки выглядят нормально (эта DLL использует те же ссылки, что и другие проекты, которые загружаются нормально).


Изменить 2:

Я попробовал предложение @SuryaBhaskar использовать LoadFrom вместо Load

 if (File.Exists(path + @"\QualityMix.dll"))
    {
        qualitymix = new AssemblyCatalog(Assembly.LoadFrom(path + @"\QualityMix.dll"));

        catalog.Catalogs.Add(qualitymix);
    }

Но я получаю ту же ошибку: не удалось загрузить файл или сборку "QualityMix.dll" или одну из его зависимостей. Была сделана попытка загрузить программу с неправильным форматом.

4b9b3361

Ответ 1

Мне удалось решить эту проблему, переместив код проблемной DLL в новый проект. Это как-то разрешило проблему... хотя причина для меня осталась мистерией.

Ответ 2

Используйте LoadFrom вместо LoadFile или Load.If вы используете Load, у него будут конфликты с другими сборками в текущем AppDomain