Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从DLL加载Prism模块_C#_Wpf_Module_Bootstrapping_Prism 4 - Fatal编程技术网

C# 从DLL加载Prism模块

C# 从DLL加载Prism模块,c#,wpf,module,bootstrapping,prism-4,C#,Wpf,Module,Bootstrapping,Prism 4,最近我对开发PRISM WPF应用程序感兴趣。现在,我正试图从构建模块项目(Wpf用户控制库)后生成的DLL加载模块。在构建模块项目期间,我复制调试文件夹中的DLL(复制:xcopy/y“$(TargetPath)”“$(SolutionDir)FooBar\$(OutDir)modules\”)。接下来我配置了引导程序,我想我丢失了它 我将在下面附上我的代码 引导器 public class Bootstrapper : UnityBootstrapper { protected

最近我对开发PRISM WPF应用程序感兴趣。现在,我正试图从构建模块项目(Wpf用户控制库)后生成的DLL加载模块。在构建模块项目期间,我复制调试文件夹中的DLL(复制:xcopy/y“$(TargetPath)”“$(SolutionDir)FooBar\$(OutDir)modules\”)。接下来我配置了引导程序,我想我丢失了它

我将在下面附上我的代码

引导器

 public class Bootstrapper : UnityBootstrapper
 {
    protected override DependencyObject CreateShell()
    {
        var shell = ServiceLocator.Current.GetInstance<Shell>();
        return shell;
    }

    protected override void InitializeShell()
    {
        base.InitializeShell();

        App.Current.MainWindow = (Window)this.Shell;
        App.Current.MainWindow.Show();
    }

    protected override IModuleCatalog CreateModuleCatalog()
    {
        return base.CreateModuleCatalog();
    }

    protected override void ConfigureModuleCatalog()
    {
        var moduleCatalog = new DirectoryModuleCatalog();
        moduleCatalog.ModulePath = Environment.CurrentDirectory + @"\Modules";
        ModuleCatalog = moduleCatalog;
    }

    protected override void InitializeModules()
    {
        base.InitializeModules();
    }

    protected override ILoggerFacade CreateLogger()
    {
        return base.CreateLogger();
    }
}
App.xaml.cs

    public partial class App : Application
    {
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        var bootstrapper = new Bootstrapper();
        bootstrapper.Run();
    }
ViewModelBase

    public abstract class ViewModelBase : INotifyPropertyChanging, INotifyPropertyChanged,IModule
    {

      //Implementation INotify etc..

    public void Initialize()
    {

    }
}

所以我想知道为什么我的ModuleCatalog.Modules总是0。有人能帮我吗?

您的模块目录是否为空?或者不包含模块? 检查Environment.CurrentDirectory+@“\Modules”;返回正确的路径和所有DLL所在的位置。 您真的需要从dir加载它们吗?您不知道将加载哪些模块吗

我通常这样做:

public partial class Bootstrapper: UnityBootstrapper
{
    protected override void ConfigureContainer()
    {
        base.ConfigureContainer();
    }

    protected override IModuleCatalog CreateModuleCatalog()
    {
        // Create the module catalog from a XAML file.
        return Microsoft.Practices.Prism.Modularity.ModuleCatalog.CreateFromXaml(new Uri("/Shell;component/ModuleCatalog.xaml", UriKind.Relative));
    }

    protected override DependencyObject CreateShell()
    {
        // Use the container to create an instance of the shell.
        ShellView view = Container.TryResolve<ShellView>();

        // Display the shell's root visual.
        //view.ShowActivated = false;
        view.Show();

        return view;
    }
}
public部分类引导程序:UnityBootstrapper
{
受保护的覆盖无效配置容器()
{
base.ConfigureContainer();
}
受保护的覆盖IModuleCatalog CreateModuleCatalog()
{
//从XAML文件创建模块目录。
返回Microsoft.Practices.Prism.Modularity.ModuleCatalog.CreateFromXaml(新Uri(“/Shell;component/ModuleCatalog.xaml”,UriKind.Relative));
}
受保护的覆盖依赖对象CreateShell()
{
//使用容器创建shell的实例。
ShellView视图=Container.TryResolve();
//显示shell的根可视化。
//view.ShowActivated=false;
view.Show();
返回视图;
}
}
还有我的ModuleCalog

<prism:ModuleCatalog xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:prism="clr-namespace:Microsoft.Practices.Prism.Modularity;assembly=Microsoft.Practices.Prism">




<prism:ModuleInfo Ref="Connexion.dll"
                  ModuleName="Connexion"
                  ModuleType="Connexion.ModuleInit, Connexion, Version=1.0.0.0" />

<prism:ModuleInfo Ref="Tools.dll"
                  ModuleName="Tools"
                  ModuleType="Tools.ModuleInit, Tools, Version=1.0.0.0" />


<prism:ModuleInfo Ref="DrawingModule.dll"
                  ModuleName="DrawingModule"
                  ModuleType="DrawingModule.ModuleInit, DrawingModule, Version=1.0.0.0"
                  InitializationMode="WhenAvailable">
    <prism:ModuleInfo.DependsOn>
        <sys:String>Connexion</sys:String>
        <sys:String>Tools</sys:String>
    </prism:ModuleInfo.DependsOn>
</prism:ModuleInfo>



<prism:ModuleInfo Ref="Sis.dll"
                  ModuleName="Sis"
                  ModuleType="Sis.ModuleInit, Sis, Version=1.0.0.0"
                  InitializationMode="WhenAvailable">
    <prism:ModuleInfo.DependsOn>
        <sys:String>Connexion</sys:String>
        <sys:String>Tools</sys:String>
        <sys:String>DrawingModule</sys:String>
    </prism:ModuleInfo.DependsOn>
</prism:ModuleInfo>

连接
工具
连接
工具
绘图模块


所有模块都有buildAction:copy“$(TargetPath)”“$(SolutionDir)Shell\$(OutDir)”

当所有模块都在同一个dll中时,你能达到相同的结果吗?我认为这是不可能的,除非你在dll中有多个程序集名称,并且有多个模块初始化…但是看起来既不干净也不好…如果你想看到“空工作”项目与您一样使用目录技术,但不指定目录。但是模块必须与包含引导程序的程序集位于同一目录中!这是一个我很乐意接受的约束。我必须将moduleCatalog.Initialize()添加到prism的ConfigureModuleCatalog中,以查找任何模块。
<prism:ModuleCatalog xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:prism="clr-namespace:Microsoft.Practices.Prism.Modularity;assembly=Microsoft.Practices.Prism">




<prism:ModuleInfo Ref="Connexion.dll"
                  ModuleName="Connexion"
                  ModuleType="Connexion.ModuleInit, Connexion, Version=1.0.0.0" />

<prism:ModuleInfo Ref="Tools.dll"
                  ModuleName="Tools"
                  ModuleType="Tools.ModuleInit, Tools, Version=1.0.0.0" />


<prism:ModuleInfo Ref="DrawingModule.dll"
                  ModuleName="DrawingModule"
                  ModuleType="DrawingModule.ModuleInit, DrawingModule, Version=1.0.0.0"
                  InitializationMode="WhenAvailable">
    <prism:ModuleInfo.DependsOn>
        <sys:String>Connexion</sys:String>
        <sys:String>Tools</sys:String>
    </prism:ModuleInfo.DependsOn>
</prism:ModuleInfo>



<prism:ModuleInfo Ref="Sis.dll"
                  ModuleName="Sis"
                  ModuleType="Sis.ModuleInit, Sis, Version=1.0.0.0"
                  InitializationMode="WhenAvailable">
    <prism:ModuleInfo.DependsOn>
        <sys:String>Connexion</sys:String>
        <sys:String>Tools</sys:String>
        <sys:String>DrawingModule</sys:String>
    </prism:ModuleInfo.DependsOn>
</prism:ModuleInfo>