第十七章:项目部署与发布指南
17.1 部署概述
17.1.1 FY_Layout部署架构
FY_Layout作为飞扬集成设计平台的插件,其部署遵循飞扬平台的插件部署规范。部署架构如下:
飞扬主程序安装目录/
├── FeiYang.exe # 飞扬主程序
├── FeiYang.dll.config # 主程序配置
├── Plugins/ # 插件目录
│ ├── QdLayout/ # 场布插件
│ │ ├── QdLayout.dll # 场布主程序集
│ │ ├── QdLayout.pdb # 调试符号文件
│ │ └── Resources/ # 资源文件
│ └── QdLayoutProvider/ # 场布Provider
│ ├── QdLayoutProvider.dll # Provider程序集
│ └── QdLayoutProvider.pdb # 调试符号文件
├── Libs/ # 共享库目录
│ ├── LightCAD.Core.dll
│ ├── LightCAD.Drawing.dll
│ ├── LightCAD.MathLib.dll
│ ├── LightCAD.Runtime.dll
│ ├── LightCAD.Model.dll
│ ├── LightCAD.RenderUtils.dll
│ ├── ThreeJs4Net.dll
│ ├── netDxf.dll
│ ├── Newtonsoft.Json.dll
│ ├── OpenTK.dll
│ ├── Dapper.dll
│ ├── Svg.dll
│ └── ... (其他依赖库)
└── Config/ # 配置文件目录
└── plugins.json # 插件注册配置
17.1.2 部署模式
FY_Layout支持两种部署模式:
| 模式 | 说明 | 适用场景 |
|---|---|---|
| 开发模式 | 直接使用Build目录输出 | 开发和调试阶段 |
| 发布模式 | 打包为独立插件包 | 生产环境部署 |
17.2 编译配置
17.2.1 解决方案配置
LightBIM.sln支持以下编译配置:
<!-- LightBIM.sln 配置 -->
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
17.2.2 项目编译设置
QdLayout.csproj的编译配置:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<BaseOutputPath>..\Build</BaseOutputPath>
</PropertyGroup>
<!-- Debug配置 -->
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
</PropertyGroup>
<!-- Release配置 -->
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<DefineConstants>TRACE</DefineConstants>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
</PropertyGroup>
<ItemGroup>
<!-- LightCAD核心库引用 -->
<Reference Include="LightCAD.Core">
<HintPath>..\Libs\LightCAD.Core.dll</HintPath>
</Reference>
<Reference Include="LightCAD.Drawing">
<HintPath>..\Libs\LightCAD.Drawing.dll</HintPath>
</Reference>
<Reference Include="LightCAD.Drawing.Actions">
<HintPath>..\Libs\LightCAD.Drawing.Actions.dll</HintPath>
</Reference>
<Reference Include="LightCAD.MathLib">
<HintPath>..\Libs\LightCAD.MathLib.dll</HintPath>
</Reference>
<Reference Include="LightCAD.Model">
<HintPath>..\Libs\LightCAD.Model.dll</HintPath>
</Reference>
<Reference Include="LightCAD.Runtime">
<HintPath>..\Libs\LightCAD.Runtime.dll</HintPath>
</Reference>
<Reference Include="LightCAD.RenderUtils">
<HintPath>..\Libs\LightCAD.RenderUtils.dll</HintPath>
</Reference>
<!-- 第三方库引用 -->
<Reference Include="ThreeJs4Net">
<HintPath>..\Libs\ThreeJs4Net.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>..\Libs\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="netDxf">
<HintPath>..\Libs\netDxf.dll</HintPath>
</Reference>
<Reference Include="Svg">
<HintPath>..\Libs\Svg.dll</HintPath>
</Reference>
<Reference Include="OpenTK">
<HintPath>..\Libs\OpenTK.dll</HintPath>
</Reference>
<Reference Include="OpenTK.WinForms">
<HintPath>..\Libs\OpenTK.WinForms.dll</HintPath>
</Reference>
<Reference Include="Flee">
<HintPath>..\Libs\Flee.dll</HintPath>
</Reference>
<Reference Include="WinFormsUI">
<HintPath>..\Libs\WinFormsUI.dll</HintPath>
</Reference>
<Reference Include="Dapper">
<HintPath>..\Libs\Dapper.dll</HintPath>
</Reference>
</ItemGroup>
</Project>
17.2.3 编译命令
# 使用dotnet CLI编译
dotnet build LightBIM.sln -c Debug
dotnet build LightBIM.sln -c Release
# 使用MSBuild编译
msbuild LightBIM.sln /p:Configuration=Release /p:Platform="Any CPU"
# 清理编译输出
dotnet clean LightBIM.sln
17.3 发布流程
17.3.1 Release编译
# 1. 清理旧的编译输出
dotnet clean LightBIM.sln -c Release
# 2. 还原NuGet包
dotnet restore LightBIM.sln
# 3. Release模式编译
dotnet build LightBIM.sln -c Release
# 4. 检查输出
ls -la Build/net8.0-windows/
17.3.2 打包脚本
# publish.ps1 - 发布打包脚本
param(
[string]$Version = "1.0.0",
[string]$OutputDir = ".\Publish"
)
Write-Host "开始打包 FY_Layout v$Version ..."
# 编译Release版本
dotnet build LightBIM.sln -c Release
if ($LASTEXITCODE -ne 0) {
Write-Error "编译失败"
exit 1
}
# 创建输出目录
$pluginDir = "$OutputDir\FY_Layout_v$Version"
New-Item -ItemType Directory -Force -Path $pluginDir
# 复制插件DLL
Copy-Item "Build\net8.0-windows\QdLayout.dll" $pluginDir
Copy-Item "Build\net8.0-windows\QdLayoutProvider.dll" $pluginDir
# 复制资源文件
if (Test-Path "Build\net8.0-windows\Resources") {
Copy-Item -Recurse "Build\net8.0-windows\Resources" $pluginDir
}
# 创建版本信息文件
@{
Name = "FY_Layout"
Version = $Version
Description = "飞扬集成设计平台场地布置插件"
Author = "znlgis"
License = "CC-BY-NC 4.0"
MinPlatformVersion = "1.0.0"
Dependencies = @(
"LightCAD.Core",
"LightCAD.Drawing",
"LightCAD.MathLib",
"ThreeJs4Net"
)
} | ConvertTo-Json | Out-File "$pluginDir\plugin.json"
# 创建ZIP包
Compress-Archive -Path $pluginDir -DestinationPath "$OutputDir\FY_Layout_v$Version.zip" -Force
Write-Host "打包完成: $OutputDir\FY_Layout_v$Version.zip"
17.3.3 版本管理
// 在LayoutPlugin.cs中添加版本信息
public class LayoutPlugin : ILcPlugin
{
public static readonly string PluginName = "FY_Layout";
public static readonly string PluginVersion = "1.0.0";
public static readonly string PluginAuthor = "znlgis";
public void Loaded()
{
LayoutLogger.Info($"{PluginName} v{PluginVersion} 正在加载...");
// 注册元素类型
LcDocument.RegistElementTypes(LayoutElementType.All);
// ... 其他初始化 ...
LayoutLogger.Info($"{PluginName} v{PluginVersion} 加载完成");
}
}
17.4 安装部署
17.4.1 手动安装
安装步骤:
1. 下载 FY_Layout_vX.X.X.zip
2. 解压到飞扬主程序的 Plugins 目录
3. 重启飞扬主程序
4. 在工具栏中应出现"场布"选项卡
17.4.2 插件配置
// plugins.json - 插件注册配置
{
"plugins": [
{
"name": "FY_Layout",
"version": "1.0.0",
"assembly": "Plugins/QdLayout/QdLayout.dll",
"provider": "Plugins/QdLayoutProvider/QdLayoutProvider.dll",
"enabled": true,
"autoLoad": true
}
]
}
17.4.3 环境检查清单
部署前检查清单:
□ .NET 8.0 Runtime 已安装
□ Visual C++ Redistributable 已安装
□ OpenGL驱动已更新
□ 飞扬主程序版本兼容
□ 所有依赖库已包含在Libs目录
□ 插件DLL已放置在正确位置
□ 配置文件已正确设置
17.5 更新与升级
17.5.1 热更新策略
// 插件支持热更新检查
public void CheckForUpdates()
{
try
{
// 检查版本更新
var currentVersion = new Version(PluginVersion);
var latestVersion = GetLatestVersion();
if (latestVersion > currentVersion)
{
// 提示用户更新
var result = MessageBox.Show(
$"发现新版本 {latestVersion},是否更新?",
"FY_Layout 更新",
MessageBoxButtons.YesNo);
if (result == DialogResult.Yes)
{
// 下载并安装更新
DownloadAndInstallUpdate(latestVersion);
}
}
}
catch (Exception ex)
{
LayoutLogger.Error("检查更新失败", ex);
}
}
17.5.2 数据迁移
// 版本升级时的数据迁移
public class DataMigration
{
public static void Migrate(string fromVersion, string toVersion)
{
var from = new Version(fromVersion);
var to = new Version(toVersion);
if (from < new Version("1.1.0") && to >= new Version("1.1.0"))
{
// v1.0 → v1.1 迁移
MigrateV10ToV11();
}
if (from < new Version("2.0.0") && to >= new Version("2.0.0"))
{
// v1.x → v2.0 迁移
MigrateV1xToV20();
}
}
private static void MigrateV10ToV11()
{
// 迁移逻辑:
// 1. 更新元素类型GUID映射
// 2. 转换属性格式
// 3. 更新图层命名规范
}
}
17.6 故障排除
17.6.1 常见部署问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 插件不加载 | DLL路径错误 | 检查plugins.json配置 |
| 缺少依赖库 | Libs目录不完整 | 补充缺失的DLL |
| 版本不兼容 | .NET版本不匹配 | 安装对应.NET Runtime |
| 三维不显示 | OpenGL驱动过旧 | 更新显卡驱动 |
| UI乱码 | 字体缺失 | 安装”仿宋”等中文字体 |
17.6.2 诊断工具
// 插件诊断信息收集
public static class DiagnosticTool
{
public static string CollectDiagnostics()
{
var sb = new StringBuilder();
sb.AppendLine("=== FY_Layout 诊断信息 ===");
sb.AppendLine($"插件版本: {LayoutPlugin.PluginVersion}");
sb.AppendLine($"运行时: {Environment.Version}");
sb.AppendLine($"操作系统: {Environment.OSVersion}");
sb.AppendLine($"64位系统: {Environment.Is64BitOperatingSystem}");
sb.AppendLine($"64位进程: {Environment.Is64BitProcess}");
sb.AppendLine($"工作目录: {Environment.CurrentDirectory}");
// 检查依赖库
sb.AppendLine("\n=== 依赖库检查 ===");
var libs = new[]
{
"LightCAD.Core", "LightCAD.Drawing",
"LightCAD.MathLib", "ThreeJs4Net",
"Newtonsoft.Json", "netDxf"
};
foreach (var lib in libs)
{
try
{
var asm = AppDomain.CurrentDomain.GetAssemblies()
.FirstOrDefault(a => a.GetName().Name == lib);
sb.AppendLine($" {lib}: {(asm != null ? asm.GetName().Version.ToString() : "未加载")}");
}
catch
{
sb.AppendLine($" {lib}: 检查失败");
}
}
// 检查OpenGL
sb.AppendLine("\n=== OpenGL信息 ===");
try
{
sb.AppendLine($" 渲染器: {OpenTK.Graphics.OpenGL.GL.GetString(OpenTK.Graphics.OpenGL.StringName.Renderer)}");
sb.AppendLine($" 版本: {OpenTK.Graphics.OpenGL.GL.GetString(OpenTK.Graphics.OpenGL.StringName.Version)}");
}
catch
{
sb.AppendLine(" OpenGL信息获取失败");
}
return sb.ToString();
}
}
17.7 本章小结
本章详细介绍了FY_Layout项目的部署与发布流程:
- 部署架构:插件式部署,包含主程序集和Provider程序集
- 编译配置:支持Debug和Release两种模式,使用dotnet CLI或MSBuild
- 发布打包:标准化的打包脚本和版本管理
- 安装部署:手动安装步骤和插件配置
- 更新升级:热更新检查和数据迁移策略
- 故障排除:常见问题诊断和解决方案
规范化的部署流程是确保FY_Layout插件稳定运行的重要保障。
| 上一章:调试测试与性能优化 | 下一章:API参考手册 |