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
相关产品推荐
相关产品推荐

