我想使用F#3.0类型提供程序机制生成基于“弱”类型数据源的“强”类型。生成的类型必须可以在仅安装.Net 4.0但不安装.Net 4.5的环境中从C#客户端访问。如果无法实现.Net 4.0兼容性,我们就无法在当前的大型ERP项目中使用类型提供程序。
到目前为止,我已经成功创建了MyGeneratedTypes.dll,方法是使用msdn上的tutorial(“提供生成的类型”一节),使用“ProvideTypes-0.2.fs”中的ProvidedTypeDefinition
,是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的对话导致了以下问题的“部分”解决方案:您可以编译一个引用具有F#3.0生成类型的库的“纯C#/ .Net 4.0”客户端,但只能通过命令行直接调用.Net 4.0 C#编译器( csc )。在VS 2010中编译或通过MSBuild命令行时,它不起作用。我怀疑这是由以下行为引起的:
据我所知,除非F#类型提供程序机制被修改,否则我们会遇到这个问题a)在生成的程序集中不需要时将refs排除到FSharp.Core 4.3,或者b)包含带有元数据“SpecificVersion:true
”的参考号。
答案 0 :(得分:6)
只需在C#项目中添加对FSharp.Core 4.3.0.0的引用(或忽略警告)。尽管奇怪的编号约定,FSharp.Core 4.3.0.0并不依赖于.Net 4.5中的任何内容,它只依赖于.Net 4.0。