【问题标题】:'Prism.Modularity.ModuleTypeLoadingException' in Prism.Wpf.dll is thrown when Prism 6 WPF application is startingPrism.Wpf.dll 中的“Prism.Modularity.ModuleTypeLoadingException”在 Prism 6 WPF 应用程序启动时被抛出
【发布时间】:2016-02-20 10:54:23
【问题描述】:

当我使用 Unity 的 Prism 6 WPF 模块化应用程序启动时,会抛出 Prism.Wpf.dll 中的“Prism.Modularity.ModuleTypeLoadingException”。以下是异常的屏幕截图:

如您所见,调用 Bootstrepper.Run 方法时会抛出异常。下面是 Botstrapper 的代码:

namespace FlowmeterConfigurator
{
    class Bootstrapper : UnityBootstrapper
    {
        protected override DependencyObject CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }

        protected override void InitializeShell()
        {
            Application.Current.MainWindow.Show();
        }

        protected override IModuleCatalog CreateModuleCatalog()
        {
            return new ConfigurationModuleCatalog();
        }
    }
}

我的应用程序的解决方案包括三个项目:使用 Prism Template Pack 作为 Prism Unity App 创建的主 WPF 项目和两个模块,每个模块都是使用 Prism Template Pack 作为 Prism 模块创建的。两个模块都注册在 App.config 文件中,请看下面:

<?xml version="1.0" encoding="utf-8" ?>
   <configuration>
      <configSections>
          <section name="modules" type="Prism.Modularity.ModulesConfigurationSection, Prism.Wpf"/>
      </configSections>
      <modules>
          <module assemblyFile="Authorization.dll" moduleType="Authorization.AuthorizationModule, Authorization, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" moduleName="AuthorizationModule" startupLoaded="true" />
          <module assemblyFile="Calibration.dll" moduleType="Calibration.CalibrationModule, Calibration, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" moduleName="CalibrationModule" startupLoaded="true" />
      </modules>
      <startup>
          <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
      </startup>
   </configuration>

第一个模块称为 Authorization,其类称为 AuthorizationModule:

namespace Authorization
{
    [Module(ModuleName = "AuthorizationModule", OnDemand = false)]
    public class AuthorizationModule : IModule
    {
       . . . . .
    }
} 

第二个模块叫做Calibration,它的类叫做CalibrationModule:

namespace Calibration
{
    [Module(ModuleName = "CalibrationModule", OnDemand = false)]
    public class CalibrationModule : IModule
    {
       . . . . .
    }
}

当我的应用程序启动时,MainWindow 会显示很短的时间(不到 1 秒),并且在这个短时间间隔之后,与 CalibrationModule 相关的 ModuleTypeLoadingException 被抛出。看起来 AuthorizationModule 的类型已成功加载,但 CalibrationModule 的类型加载失败。请帮我消除这个错误。

附:我没有在我的应用程序中定义任何 IModuleManager 实例。可能我必须在我的应用程序的某个地方定义它?

【问题讨论】:

  • 有了这些信息,真的很难猜出发生了什么。我建议您比较配置文件中的名称和您尝试链接的 dll。
  • 你的dll和exe在同一个文件夹吗?
  • 文件夹 'D:\My_C#_Projects\FlowmeterConfiguration_Unity\FlowmeterConfigurator\FlowmeterConfigurator\bin\Debug' 中有 FlowmeterConfiguration.exe 以及 Microsoft 和 Prism 的 dll。
  • 更改模块的输出路径,使它们最终位于 exe 所在的目录中(即“..\TheApp\bin\debug\”而不是“bin\debug\”,对于release),并将模块作为构建依赖项添加到 exe 项目中,以便在构建 exe 时实际构建它们。
  • 我已将模块 dll 的引用添加到解决方案中 shell 项目的引用列表中,并且我的应用程序工作正常!

标签: c# wpf prism


【解决方案1】:

异常表示 prism 找不到 .dll 文件。 您的 .exe 文件和模块的 .dll 文件应该在同一个文件夹中(根据您在上一个问题中的 app.config);

【讨论】:

  • 我应该将每个模块的dll复制到shell应用程序的exe文件所在的文件夹中吗?
  • 我已将模块的 DLL 引用添加到 shell 项目中,我的应用程序运行良好!
【解决方案2】:

异常表示 prism 找不到 .dll 文件。如果解决方案的不同项目不是使用相同的 Target Framework 版本构建的,则可能找不到这些。当模块项目是在 .Net Framework 4.5.2 中构建时,我遇到了这个错误,而主项目是在 4.5.1 中。 更正/对齐目标框架版本,退出 Visual Studio,重新进入,重建。然后错误就消失了。

大多数情况下,出现异常的原因有很多。

【讨论】:

    【解决方案3】:

    .exe 和 .dll 应该在同一个文件夹中,以避免这种异常,可以通过以下两种方式实现

    1) 转到模块项目属性 -> 构建事件 -> 构建事件后命令行和 粘贴以下代码

    copy "$(TargetPath)" "$(SolutionDir)MainWPFProject\bin\$(ConfigurationName)"
    

    上面代码中的 MainWPFProject 表示项目有 App.config 文件。

    2) 手动复制依赖模块.dll

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多