如何使用F#3.0类型提供程序生成C#友好,.Net 4.0兼容类型

Mar*_*ist 10 f# type-providers f#-3.0

我想使用F#3.0类型提供程序机制生成基于"弱"类型数据源的"强"类型.生成的类型必须可以在仅安装.Net 4.0但不安装.Net 4.5的环境中从C#客户端访问.如果无法兼容.Net 4.0,我们就无法在当前的大型ERP项目中使用类型提供程序.

到目前为止,我已经成功地通过遵循创建MyGeneratedTypes.dll 教程 MSDN上(节"提供生成的类型"),使用ProvidedTypeDefinition从"ProvidedTypes-0.2.fs",这是F#3.0样本包的一部分.(为了使它工作,我不得不File.Delete从" ProvidedTypeDefinition.ConvertToGenerated..."方法中删除" ......" 行).

MyGeneratedTypes.dll具有运行时版本v4.0.30319,这是正常的(.Net 4.0的运行时).我可以在C#/ .Net 4.0应用程序中添加对MyGeneratedTypes.dll的引用,IntelliSense按预期显示类型和成员.但是,当我尝试编译时,C#编译器失败并产生'警告MSB3258:主要引用"MyGeneratedTypes"无法解析,因为它与.NET Framework程序集间接依赖"FSharp.Core,Version = 4.3.0.0 ,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a"其版本"4.3.0.0"高于当前目标框架中的版本"4.0.0.0".

看看IL Spy确认MyGeneratedTypes.dll确实包含对FSharp.Core 4.3的引用,尽管这个引用完全没必要.到目前为止,我没有办法阻止F#编译器将此引用放入生成的程序集中.(除此之外,我在C#中创建了一个纯.Net 4.0程序集并将其传递给构造函数ProvidedTypeDefinition,但这没有影响).

有没有人知道a)如何摆脱引用,或b)如果这只是一个F#3.0发布候选问题,将在最终版本中解决.

编辑

与@Brian的对话导致了以下问题的"部分"解决方案:您可以编译一个"纯C#/ .Net 4.0"客户端引用具有F#3.0生成类型的库,但只能通过调用.Net 4.0 C#编译器(csc)直接来自命令行.在VS 2010中编译或通过MSBuild命令行时,它不起作用.我怀疑这是由以下行为引起的:

  1. MyGeneratedTypes.dll在VS 2012中使用F#类型提供程序机制生成.
  2. 在生成期间,将自动插入对FSharp.Core 4.3的引用(即使不需要),而不在依赖项的元数据中指定"SpecificVersion:true".
  3. VS 2010中的".Net 4.5-free"系统中的AC#客户端引用了MyGeneratedTypes.dll.
  4. 编译C#客户端时,MSBuild会在MyGeneratedTypes.dll中发现对FSharp.Core 4.3的间接引用.
  5. 由于间接引用与"SpecificVersion:false"一起存在,MSBuild会发出警告MSB3257并拒绝将直接引用/r:"MyGeneratedTypes.dll"传递给C#编译器(csc).(注意:无法以任何方式抑制MSBuild警告.)
  6. C#编译器(csc)由MSBuild调用,没有/r:"MyGeneratedTypes.dll".因此,它无法编译,并发出编译器错误CS0246:"无法找到类型或命名空间名称'MyGeneratedTypes'(...)".

据我所知,除非F#类型提供程序机制被修改,否则我们会遇到这个问题:a)在生成的程序集中不需要将FS引用到FSharp.Core 4.3,或者b)包含ref使用元数据" SpecificVersion:true".

Bri*_*ian 6

只需在C#项目中添加对FSharp.Core 4.3.0.0的引用(或忽略警告).尽管奇怪的编号约定,FSharp.Core 4.3.0.0并不依赖于.Net 4.5中的任何内容,它只依赖于.Net 4.0.

  • 好的,分享你得到的实际编译器错误会很有帮助.所以你说ildasm/ilspy看到这些公共类型出现在F#程序集中,但由于某种原因,C#编译器没有"看到"它们,即使程序集在csc.exe上引用了'/ r'命令行? (2认同)