C# 可由便携式F#项目读取的本地化(配置文件259)

C# 可由便携式F#项目读取的本地化(配置文件259),c#,f#,visual-studio-2017,C#,F#,Visual Studio 2017,我正在参加Visual Studio 2017 RC的试驾,遇到了一个绊脚石 我的项目包含一个ASP.NET核心Web项目和两个可移植的F#库(概要文件259)。web项目引用了这些库,我希望将来添加Xamarin表单项目,这些项目也引用相同的Profile 259库 我还希望有一个本地化资源文件(可能在它自己的共享项目中),我的解决方案中的所有项目都可以读取该文件。在Visual Studio 2015中,我通过创建一个可移植的C#项目并添加相关的resx文件实现了这一点 在Visual S

我正在参加Visual Studio 2017 RC的试驾,遇到了一个绊脚石

我的项目包含一个ASP.NET核心Web项目和两个可移植的F#库(概要文件259)。web项目引用了这些库,我希望将来添加Xamarin表单项目,这些项目也引用相同的Profile 259库

我还希望有一个本地化资源文件(可能在它自己的共享项目中),我的解决方案中的所有项目都可以读取该文件。在Visual Studio 2015中,我通过创建一个可移植的C#项目并添加相关的
resx
文件实现了这一点

在Visual Studio 2017中,我无法添加可移植的C#类库。当我尝试这样做时,它会提供一个模式对话框,该对话框不接受它提供给我的任何选项:

但是,我可以添加一个Xamarin表单库:

虽然这引用了我并不感兴趣的Xamarin表单库,但至少可以添加它,我可以将本地化文件
LocalisedStrings.resx
添加到项目中

但是,即使我在
resx
文件中将访问修饰符更改为“Public”,也无法从我的F#库中读取它。代码

module Locales =
    let [<Literal>] private Gender = "Gender"
    let private localisedStringsProperties = typeof<LocalisedStrings>.GetTypeInfo().DeclaredProperties
    let GetStringDictionary(predicate) = localisedStringsProperties |> Seq.filter predicate |> Seq.map (fun p -> (p.Name, p.GetMethod.Invoke(null, [||]).ToString())) |> dict
    let GetGenders() = GetStringDictionary(fun p -> p.Name.StartsWith(Gender) && p.Name.Length > Gender.Length)
    let GetValues(keys) = 
        let values = GetStringDictionary(fun p -> keys |> Array.exists(fun key -> key = p.Name))
        let evaluate key =
            match values.ContainsKey key with
            | true -> values.[key]
            | false -> key
        keys |> Array.map evaluate
    let GetValue(key) = GetValues([|key|]).[0]
模块区域设置=
让[]私人性别=“性别”
让private LocalizedStringsProperties=typeof.GetTypeInfo().DeclaredProperties
让GetStringDictionary(谓词)=LocalizedStringsProperties |>Seq.filter谓词|>Seq.map(fun p->(p.Name,p.GetMethod.Invoke(null,[| |]].ToString())|>dict
让GetGenders()=GetStringDictionary(fun p->p.Name.StartsWith(Gender)&&p.Name.Length>Gender.Length)
让GetValue(键)=
让value=GetStringDictionary(fun p->keys |>Array.exists(fun key->key=p.Name))
让我们来评估关键点=
将values.ContainsKey键与
|真->值。[键]
|false->key
keys |>Array.map求值
让GetValue(键)=GetValues([|键|])[0]
无法识别命名空间或类
LocalisedStrings

问题

  • 有没有其他方法可以从便携式F#library进行本地化?我不能直接添加
    resx
    文件,这就是我在2015年的项目中使用便携式C#库的原因。然而,如果有一种更有效的方法,我愿意使用它
  • 我不能添加一个可移植的C#项目这一事实是一个发布候选错误,还是该项目类型已被弃用
  • 为什么我的F#library没有提取
    LocalisedStrings
    类和命名空间,即使项目引用已成功添加,并且
    resx
    access修饰符已更改为public

  • 更新:问题2已得到回答。这是一个PEBKAC问题:我只需选中多个复选框。在本例中,我需要检查配置文件259中包含的所有选项(.NET Framework 4,5,ASP.NET Core 1.0,Windows 8,Windows Phone 8.1,Windows Phone Silverlight 8)。然而,问题1和问题3仍然存在。

    这听起来像是一个bug,您可能应该复制这个优秀而详细的描述并报告它。这很可能也能回答你的第二个问题,尽管我怀疑它是否被抹黑。作为循环参考,看起来像你。感谢亚伯的建议。只需稍作修改。