Xamarin.Forms中Secrets.cs未生成,无法通过IntelliSense访问Secrets对象的问题求助
解决Xamarin.Forms中Secrets对象无法被IntelliSense识别的问题
看起来你已经完成了基础的NuGet安装和secrets.json创建,但要让Secrets.KumKey1正常工作,还缺了几个关键步骤,我帮你梳理一下:
1. 将secrets.json设置为嵌入资源
右键项目根目录下的secrets.json文件 → 选择「属性」→ 在「生成操作」下拉菜单中选择「嵌入的资源」。这一步是核心,否则编译时文件不会被打包进程序集,后续代码根本找不到它。
2. 创建Secrets静态类读取配置
secrets.json本身只是文本文件,不会自动生成Secrets对象供你直接调用。你需要手动写一个静态类来读取并映射JSON内容,示例代码如下:
using System; using System.IO; using System.Reflection; using Newtonsoft.Json; // 若用System.Text.Json可替换,需对应.NET版本支持 namespace YourAppNamespace // 替换成你实际的应用命名空间 { public static class Secrets { private static readonly Lazy<SecretsModel> _secretValues = new Lazy<SecretsModel>(LoadSecretsFromJson); public static string KumKey1 => _secretValues.Value.KumKey1; private static SecretsModel LoadSecretsFromJson() { var assembly = typeof(Secrets).GetTypeInfo().Assembly; // 资源名称格式为「命名空间.文件名」,务必和实际匹配 var resourceName = $"{typeof(Secrets).Namespace}.secrets.json"; using (var stream = assembly.GetManifestResourceStream(resourceName)) { if (stream == null) throw new FileNotFoundException("secrets.json未找到,请检查嵌入资源配置和命名空间"); using (var reader = new StreamReader(stream)) { var jsonContent = reader.ReadToEnd(); return JsonConvert.DeserializeObject<SecretsModel>(jsonContent); } } } // 内部类用于映射JSON结构 private class SecretsModel { public string KumKey1 { get; set; } } } }
3. 确认NuGet依赖匹配
如果用上面的代码,需确保对应序列化包已安装:
- 若使用
Newtonsoft.Json:给所有相关项目安装Newtonsoft.JsonNuGet包 - 若使用
System.Text.Json:确认项目目标.NET版本支持(如.NET Standard 2.0+),无需额外安装包,直接替换序列化代码即可。
4. 清理并重新生成解决方案
IntelliSense偶尔会有缓存问题,做完上述步骤后,右键解决方案 → 选择「清理解决方案」,再点击「重新生成解决方案」,IntelliSense就能识别Secrets对象了。
如果不确定嵌入资源名称是否正确,可以临时添加var resourceNames = assembly.GetManifestResourceNames();,调试时查看所有嵌入资源列表,确认secrets.json是否在其中。
内容的提问来源于stack exchange,提问作者innom
相关产品推荐
相关产品推荐

