未找到已部署应用程序的 MEF 部件,但在调试模式下找到

MEF Parts not found for deployed app, but found in Debug mode

我在这里检查了很多 MEF 问题,但我无法想象我的问题是什么。这是正在发生的事情:

我有一个使用 AdvancedInstaller 部署的桌面 WPF 应用程序。我使用 .NET 4.0 和 MEF 来组合零件。有些部分在主项目中,因此它们在 app.exe 文件中。其他部分在引用主项目的 class 个库中,因此它们在 somename.dll 个文件中。

问题: 运行 来自 VS 的应用程序,无论是在调试还是在发布中,一切都很好。部署应用程序后,一些 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 多个文件,而且我无法将我的插件 dll 部署到不同的目录中。

为什么查看所有文件的 DirectoryCatalog 都能找到部分,而查看单个部分的 DirectoryCatalog 却找不到?如果此问题只发生在已部署的应用程序中,我该如何调试?

---编辑:这个问题只发生在某些 dll 上,文件找到了,其他 dll 的部分也找到了。我在所有 dll 中使用相同的 Export/Import 过程,但不知何故其中一些在部署中没有显示任何部分

任何您能提出的建议都会有所帮助,谢谢你们!


新信息!

我尝试使用 AssemblyCatalog 加载我的 dll。它在 Visual Studio(调试和发布)中工作,但在部署时出现以下错误:

第一次尝试:

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' 或其依赖项之一。试图加载格式不正确的程序。

我已经查找过有关这些错误的问题,但到目前为止没有任何帮助。所有项目都是为所有 CPU 构建的,引用看起来不错(此 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' 或其依赖项之一。试图加载格式不正确的程序。

使用 LoadFrom 而不是 LoadFile 或 Load.If 你使用 Load 它将与当前 AppDomain 上的其他程序集发生冲突

我设法通过将有问题的 dll 代码移至新项目来解决此问题。这解决了这个问题,不知何故......虽然原因对我来说仍然是一个谜。