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

NuGet包安装脚本获取AssemblyInfo.cs内容报错,求解决方法

解决NuGet Install.ps1中访问AssemblyInfo.cs的"Value does not fall within the expected range"错误

这个错误我之前帮不少开发者排查过,核心问题是你直接用完整相对路径访问ProjectItems.Item()的方式不符合VS项目对象模型(DTE)的规则——VS对项目内文件的定位需要分层级访问,而不是直接传递Properties\AssemblyInfo.cs这种路径字符串。

问题根源

$project.ProjectItems.Item()方法只能直接访问项目根目录下的项(文件或文件夹),而Properties本身是一个文件夹类型的ProjectItem,你不能跳过它直接访问里面的AssemblyInfo.cs。直接传递组合路径会导致DTE无法正确定位到目标文件,从而抛出"值不在预期范围内"的错误。

修正后的代码

下面是调整后的Install.ps1脚本,通过分层级定位文件,同时优化了文件读取的可靠性:

param($installPath, $toolsPath, $package, $project)

# 第一步:先定位到项目中的Properties文件夹
$propertiesFolder = $project.ProjectItems.Item("Properties")
if (-not $propertiesFolder) {
    throw "无法在项目中找到Properties文件夹,请检查项目结构。"
}

# 第二步:从Properties文件夹中获取AssemblyInfo.cs文件
$assemblyInfoItem = $propertiesFolder.ProjectItems.Item("AssemblyInfo.cs")
if (-not $assemblyInfoItem) {
    throw "无法在Properties文件夹中找到AssemblyInfo.cs文件。"
}

# 第三步:获取文件的物理磁盘路径,再读取内容(推荐这种方式,避免DTE对象操作的潜在问题)
$assemblyInfoPath = $assemblyInfoItem.FileNames(1)
# 指定UTF8编码读取,避免乱码问题(项目文件通常用UTF8编码)
$content = Get-Content -Path $assemblyInfoPath -Encoding UTF8

# 这里可以添加你需要的代码修改逻辑,比如向content中追加或插入代码
# 示例:添加自定义AssemblyAttribute
$newAttribute = '[assembly: System.Reflection.AssemblyMetadata("NuGetCustomAttribute", "AddedByMyPackage")]'
if ($content -notcontains $newAttribute) {
    $content += $newAttribute
    # 写回文件,同样指定UTF8编码
    Set-Content -Path $assemblyInfoPath -Value $content -Encoding UTF8
}

额外注意事项

  • 编码问题:一定要指定编码(比如UTF8),否则Get-Content和Set-Content可能会用系统默认编码,导致文件乱码或格式错误。
  • SDK风格项目兼容:如果你的NuGet包需要支持.NET Core/.NET 5+的SDK风格项目,注意这类项目默认不会生成物理的AssemblyInfo.cs(相关属性在项目文件中定义),你可能需要添加条件判断来处理这种情况。
  • 重复修改防护:添加代码前最好检查目标内容是否已经存在,避免重复添加相同的代码片段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:02:11