我在这里检查了很多 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/