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

VB.NET项目打包NuGet后JSON文件无法找到的技术求助

问题分析与解决办法

核心问题

你用IO.File.ReadAllText(filename)读取文件时,程序是从当前工作目录找文件,而不是NuGet包的路径。当测试项目引用你的包后,工作目录变成了测试项目的执行目录(比如测试项目的bin文件夹或者解决方案根目录),所以找不到原来包项目里的JSON文件。

就算你把JSON文件的「复制到输出目录」设为始终复制,也可能因为NuGet打包时的内容文件配置问题,导致文件没被正确复制到测试项目的输出目录,或者路径对不上。

解决方法

方法1:把JSON嵌成程序集资源(推荐)

这种方式能让JSON和DLL绑定在一起,路径绝对稳定,不受工作目录影响:

  • 在包项目里选中所有JSON文件,把生成操作改成嵌入的资源(替换原来的「内容」)。
  • 用下面的代码读取嵌入的资源:
Imports System.IO
Imports System.Reflection

' 获取当前程序集
Dim currentAssembly As Assembly = Assembly.GetExecutingAssembly()
' 资源名称格式:[项目命名空间].[文件所在路径].json(比如命名空间是MyNuGetLib,文件在Resources文件夹下叫settings.json,就是MyNuGetLib.Resources.settings.json)
Dim resourceFullName As String = "你的命名空间.你的Json文件路径.json"

Using resourceStream As Stream = currentAssembly.GetManifestResourceStream(resourceFullName)
    Using streamReader As New StreamReader(resourceStream)
        Dim jsonContent As String = streamReader.ReadToEnd()
        ' 这里处理JSON内容
    End Using
End Using

提示:可以用ILSpy之类的工具查看程序集的清单资源,确认资源名称是否正确。

方法2:确保NuGet包把文件复制到消费项目

如果一定要用文件系统读取,得保证NuGet包把JSON文件作为内容文件发布,并且代码里用绝对路径:

  • 在包项目的.vbproj文件里加这段配置,确保JSON被打包成内容文件:
<ItemGroup>
  <Content Include="**/*.json">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    <PackageCopyToOutput>true</PackageCopyToOutput>
    <PackagePath>contentFiles\any\any\;lib\$(TargetFramework)</PackagePath>
  </Content>
</ItemGroup>
  • 代码里基于程序集位置构建绝对路径,别用相对路径:
Imports System.IO
Imports System.Reflection

' 获取当前程序集所在的目录
Dim assemblyDir As String = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
Dim jsonFilePath As String = Path.Combine(assemblyDir, "你的Json文件名.json")
Dim jsonContent As String = File.ReadAllText(jsonFilePath)

为啥一年前没问题?

大概率是当时的环境或配置不一样:比如用的是packages.config而非PackageReference,或者测试执行时的工作目录默认和程序集目录一致,现在这些变了,相对路径就失效了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:13:24