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

如何通过C#获取DotNetNuke模块.dnn定义文件中配置的版本号

DotNetNuke 模块开发中读取.dnn包定义模块版本的实现方法

常见踩坑说明

你之前使用new ModuleController().GetModule(this.ModuleId).ModuleVersion始终返回-1的原因是:
该属性对应ModuleInfo类中的实例级标记字段,并不存储.dnn安装清单中定义的模块包版本。这个字段的设计用途是记录模块实例的数据迁移适配状态,默认初始值为-1,和安装包本身的版本配置没有绑定关系。
你在.dnn配置中写的<package name="xxxx" type="Module" version="02.01.88">这段内容,DNN在安装时会将其中的版本值单独写入系统的包元数据表,不会同步到Modules表的版本字段,因此无法通过原代码路径读取到目标版本字符串。

正确获取路径

DNN完成模块安装后,会将.dnn文件中定义的包名称、版本等元数据写入系统Packages表,并通过模块定义(ModuleDefinition)和具体的模块实例做关联,可通过以下步骤读取目标版本字符串:

  • 第一步:通过当前模块ID获取对应的模块定义ID
  • 第二步:通过模块定义ID关联查询绑定的包记录
  • 第三步:直接读取包记录中的Version字段,该字段值和.dnn文件中配置的版本字符串完全一致

可直接复用的实现代码

// 获取当前请求对应的模块实例
var currentModule = new ModuleController().GetModule(ModuleId);
// 拿到模块实例关联的定义ID
int targetModuleDefId = currentModule.ModuleDefID;

// 查询模块定义关联的包信息
var moduleDef = new ModuleDefinitionController().GetModuleDefinition(targetModuleDefId);
var packageController = new PackageController();
var matchedPackage = packageController.GetPackages()
    .FirstOrDefault(pkg => pkg.PackageID == moduleDef.PackageID);

if (matchedPackage != null)
{
    // 此处获取的字符串即为.dnn配置中的"02.01.88"值
    string targetVersion = matchedPackage.Version;
}

注意事项

  • 无需手动读取服务器上的物理.dnn文件做XML解析,DNN安装阶段已经完成配置元数据的数据库同步,直接通过内置Controller读取即可,避免不必要的文件IO开销。
  • 该方法获取的是模块包在当前站点安装的全局版本,和单个模块实例上的自定义配置无关。
  • 若需要区分实例级自定义版本和包全局版本,可分别读取ModuleInfo.ModuleVersion和上面的包版本字段,注意两者的存储边界差异。

内容的提问来源于stack exchange,提问作者Erick Lanford Xenes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 14:45:03