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

