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

Han*_*ish 11 wpf dll plugins mef catalog

我在这里检查了很多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
}
Run Code Online (Sandbox Code Playgroud)

唯一可行的(但启动应用程序的速度非常慢)如下:

var catalog = new DirectoryCatalog(".", "*");
Run Code Online (Sandbox Code Playgroud)

这有一个问题,它需要检查工作目录中存在的100多个文件,我不能在不同的目录中部署我的插件dll.

为什么查看所有文件的DirectoryCatalog会找到这些部件,但查看单个部件的DirectoryCatalog却没有?如果仅在部署的应用程序中发生此问题,我该如何调试此问题?

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

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


新信息!

我尝试用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);
    }
Run Code Online (Sandbox Code Playgroud)

错误:模块应包含程序集清单.(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);
    }
Run Code Online (Sandbox Code Playgroud)

错误:无法加载文件或程序集"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);
    }
Run Code Online (Sandbox Code Playgroud)

但我得到同样的错误:无法加载文件或程序集'QualityMix.dll'或其依赖项之一.尝试加载格式不正确的程序.

Han*_*ish 0

我通过将有问题的 dll 的代码移动到新项目来解决这个问题。这以某种方式解决了问题......尽管原因对我来说仍然是个谜。