未找到已部署应用程序的 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 说它们没有要导出的部分(零)。
我检查了以下内容:
- 部署中的所有 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 中使用相同的 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 代码移至新项目来解决此问题。这解决了这个问题,不知何故......虽然原因对我来说仍然是一个谜。
我在这里检查了很多 MEF 问题,但我无法想象我的问题是什么。这是正在发生的事情:
我有一个使用 AdvancedInstaller 部署的桌面 WPF 应用程序。我使用 .NET 4.0 和 MEF 来组合零件。有些部分在主项目中,因此它们在 app.exe 文件中。其他部分在引用主项目的 class 个库中,因此它们在 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 中使用相同的 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 代码移至新项目来解决此问题。这解决了这个问题,不知何故......虽然原因对我来说仍然是一个谜。