wpf - 未找到部署的应用程序的 MEF 部件,但在 Debug模式下找到

标签 wpf dll plugins mef catalog

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

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

问题: 从 VS 运行应用程序时,无论是在调试还是发布中,一切都很好。当我部署应用程序后,一些 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 多个文件,并且我无法将我的插件 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);
    }

错误:模块应包含程序集 list 。 (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”或其依赖项之一。尝试加载格式不正确的程序。

最佳答案

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

关于wpf - 未找到部署的应用程序的 MEF 部件,但在 Debug模式下找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31428087/

相关文章:

WPF 隐藏顶部面板布局

c# - 使用 ViewModel (MVVM) 在当前 View 的子用户控件中设置属性

c++ - "Windows doesn' t 支持正确的动态链接是什么意思?”

plugins - WordPress 插件 - 如何更改发布日期时间?

git - Visual Studio 2010 Express 是否会阻止源代码管理插件?

java - 在 Eclipse 中手动安装 scala-maven-plugin

c# - 旋转边框不会改变窗口大小

c# - WPF MVVM 与 Messenger 通信(VM 的消息后加载)

java - 线程 "main"java.lang.Error : Invalid memory access(Unknown Source) 中的 JNA 异常

WPF。将DLL嵌入到EXE中