.NET6项目使用FSharp.Configuration的ResXProvider调用资源报FS3033错误
报错原因
这个错误是FSharp.Configuration旧版本的ResXProvider与.NET 6+的程序集加载API不兼容导致的,类型提供者内部调用的.NET Framework时代的资源读取方法在.NET 6中已被移除或签名变更。
解决方案
按以下步骤依次排查即可解决:
- 升级FSharp.Configuration依赖到2.0.0及以上的稳定版本,低于该版本的包未适配.NET 6的运行时环境
- 在项目的.fsproj文件中添加以下属性组配置,修正类型提供者和资源生成的兼容逻辑:
<PropertyGroup> <!-- 关闭类型提供者的程序集影子拷贝,避免运行时找不到加载的资源程序集 --> <FSharpTypeProviderDisableShadowCopy>true</FSharpTypeProviderDisableShadowCopy> <!-- 用.NET Core+兼容的方式序列化资源文件 --> <GenerateResourceUsePreserializedResources>true</GenerateResourceUsePreserializedResources> </PropertyGroup>
- 确认resx文件的配置正确,设置为嵌入资源且随项目输出:
<EmbeddedResource Include="Resources/Strings.resx"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </EmbeddedResource>
- 调整资源调用方式,ResXProvider生成的类型需要实例化后访问成员,不可直接用静态类访问:
open FSharp.Configuration type ResourceProvider = ResXProvider<file="Resources/Strings.resx"> // 正确调用方式 let resources = ResourceProvider() let greeting = resources.Greeting
备选方案
如果你只需要强类型访问resx资源,不需要用到FSharp.Configuration的其他功能,可以直接移除该依赖,.NET 6原生支持resx强类型生成:只需将resx文件设置为EmbeddedResource,MSBuild会在编译时自动生成对应的强类型访问类,无需额外配置。
内容的提问来源于stack exchange,提问作者CaptnCodr
相关产品推荐
相关产品推荐

