You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Prism构建ETABS插件(.dll)无App.xaml场景的实现问题问询

ETABS类库插件接入Prism框架实现方案

Prism框架本身不强制依赖WPF应用的App.xaml入口,你可以在cPlugin的Main方法内手动完成Prism容器初始化、服务注册、视图解析的全流程,完全适配类库项目的约束。

前置准备

先通过NuGet安装以下依赖包:

  • Prism.Wpf
  • Prism.DryIoc(或你习惯使用的Prism容器实现,如Unity)

实现步骤

  1. 移除原有MainView的手动DataContext绑定代码,Prism会自动完成视图和ViewModel的关联
  2. 在cPlugin的Main方法内手动构建Prism容器,完成服务、视图、ViewModel的注册
  3. 从容器中解析出MainView实例后再显示

改造后的代码示例

CPlugin.cs

using Combonito.Views;
using CSiAPIv1;
using Prism.DryIoc;
using Prism.Ioc;
using System;
using System.Windows;

namespace Combonito
{
    public class cPlugin
    {
        private MainView _MyForm;
        // 存储ETABS上下文对象,用于注册到Prism容器
        private cSapModel _sapModel;
        private cPluginCallback _sapPlugin;

        public void Main(ref cSapModel _SapModel, ref cPluginCallback _ISapPlugin)
        {
            _sapModel = _SapModel;
            _sapPlugin = _ISapPlugin;
            try
            {
                // 手动初始化Prism容器
                var app = new PrismApplicationBuilder()
                    .UseDryIoc()
                    .ConfigureServices(RegisterServices)
                    .ConfigureRegionAdapterMappings(_ => {
                        // 如果用到Region功能,在这里配置区域适配器,不需要可以省略
                    })
                    .Build();

                // 从容器解析MainView,Prism会自动绑定对应ViewModel
                _MyForm = app.Container.Resolve<MainView>();
                _MyForm.ShowDialog();

                // 窗口关闭后调用ETABS要求的Finish方法
                _sapPlugin.Finish(0);
            }
            catch (Exception ex)
            {
                try
                {
                    _sapPlugin.Finish(1);
                    Console.WriteLine(ex);
                }
                catch (Exception ex1)
                {
                    Console.WriteLine(ex1);
                    throw;
                }
            }
        }

        // 注册所有服务、视图、ViewModel
        private void RegisterServices(IContainerRegistry containerRegistry)
        {
            // 注册ETABS上下文对象,方便在ViewModel中注入使用
            containerRegistry.RegisterInstance(_sapModel);
            containerRegistry.RegisterInstance(_sapPlugin);

            // 注册视图和ViewModel的关联,用ViewModelLocator自动绑定
            containerRegistry.RegisterForNavigation<MainView, MainWindowViewModel>();

            // 其他你需要用到的服务都在这里注册
            // containerRegistry.Register<IMyService, MyService>();
        }

        public int Info(ref string txt)
        {
            try
            {
                txt = "你的插件说明";
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                throw;
            }
            return 0;
        }

        ~cPlugin()
        {
            Console.WriteLine(GC.GetGeneration(0));
        }
    }
}

关键说明

  • 如果你的Prism版本没有PrismApplicationBuilder,可以改用老式的Bootstrapper写法,原理一致:自定义DryIocBootstrapper子类,重写ConfigureContainer、RegisterTypes等方法,然后在Main方法里调用Bootstrapper.Run()即可
  • 不需要对MainView做额外改动,只要保证ViewModel的命名符合Prism的ViewModelLocator默认规则(View在Views目录,ViewModel在ViewModels目录,名称为XXXViewModel对应XXXView),或者手动指定关联
  • Prism的事件聚合器、导航、对话框服务等功能都可以正常使用,所有需要用到的组件提前在RegisterServices中注册即可

内容的提问来源于stack exchange,提问作者user15798960

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 20:48:04