Я проверил много вопросов 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" или одну из его зависимостей. Была сделана попытка загрузить программу с неправильным форматом.