【问题标题】:Missing namespace while running F# script from command line从命令行运行 F# 脚本时缺少命名空间
【发布时间】:2014-01-06 13:54:09
【问题描述】:

我正在尝试按照此链接http://msdn.microsoft.com/en-us/library/hh361033.aspx 从通过命令行 fsx.exe 触发的 F# 脚本中通过 SqlDataConnection 运行数据库查询。

当我从 VS2012 交互式窗口运行以下脚本行时,打开所有命名空间没有问题。

#r "FSharp.Core.dll"
#r "System.Data.dll"
#r "FSharp.Data.TypeProviders.dll"
#r "System.Data.Linq.dll"


open Microsoft.FSharp.Linq
open System
open System.Data
open System.Data.Linq
open Microsoft.FSharp.Data.TypeProviders

--> Referenced 'C:\Program Files (x86)\Reference Assemblies\Microsoft\FSharp\3.0\Runtime\v4.0\FSharp.Core.dll'


--> Referenced 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Data.dll'


--> Referenced 'C:\Program Files (x86)\Reference Assemblies\Microsoft\FSharp\3.0\Runtime\v4.0\Type Providers\FSharp.Data.TypeProviders.dll'


--> Referenced 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Data.Linq.dll'

但是,如果我使用 FSI.exe 从命令行窗口运行相同的脚本文件,则会出现错误

Script4.fsx(9,23): error FS0039: The namespace 'Linq' is not defined.  

第 9 行指的是 Microsoft.FSharp.Linq 命名空间。

Q1:我在这里缺少什么?

当我在 VS2012 交互式窗口中运行脚本时,我可以看到所有 参考信息/添加路径/绑定信息和Val信息。但是,如果我从命令行运行脚本,则不会打印任何内容来帮助我调试。

Q2:VS2012交互窗口打印的信息是否可以打印到命令行窗口?

问候 卡比

【问题讨论】:

    标签: command-line f#-interactive


    【解决方案1】:

    Linq 命名空间主要在 System.Core.dll 中定义。我猜想在 VS 交互式窗口中这是隐式导入的,因此您的脚本可以工作,并且它不会在 FSI 中隐式导出。无论哪种方式,您都应该能够通过将以下内容添加到脚本来解决此问题

    #r "System.Core.dll"
    

    【讨论】:

    • 嗨 JaredPar,我已经尝试过您的建议,但没有帮助。但是,此后我偶然发现了根本原因。这是由于 fsi.exe 的配置造成的。它以某种方式加载了 F# 2.0 库。
    【解决方案2】:

    我不知何故偶然发现了这个问题的根本原因:未定义 linq 库的原因是当我从命令行运行 fsi.exe 时,它​​加载了 F# V2.0 核心库。

    因为当我尝试从命令行执行fsi.exe myScript.fsx时,没有输出Val,Reference和加载信息打印到stdout,我尝试通过不带脚本运行fsi.exe直接进入fsi会话名称并逐行粘贴脚本内容。这就是我发现问题的方式:

    C:\Users\casbby>fsi
    
    Microsoft (R) F# 2.0 Interactive build 4.0.40219.1
    Copyright (c) Microsoft Corporation. All Rights Reserved.
    
    For help type #help;;
    
    > #r "FSharp.Core.dll";;
    
    --> Referenced 'C:\Program Files (x86)\Reference Assemblies\Microsoft\FSharp\2.0
    \Runtime\v4.0\FSharp.Core.dll'
    
    >
    

    然后我意识到我的电脑上实际上有 2 个 FSharp 安装:

    C:\Program Files (x86)\Microsoft F#\v4.0 (这是我在 PATH 中遵循的 F# 博客文章可能已过时的内容) 和

    C:\Program Files (x86)\Microsoft SDKs\F#\3.0\Framework\v4.0 (VS2012就是这样用的)

    这两个位置之间的一个关键区别是 fsi.exe.config 文件。正确的 fsi 具有所有版本重定向配置,如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <runtime>
        <legacyUnhandledExceptionPolicy enabled="true" />
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity
              name="FSharp.Core"
              publicKeyToken="b03f5f7f11d50a3a"
              culture="neutral"/>
            <bindingRedirect
              oldVersion="2.0.0.0"
              newVersion="4.3.0.0"/>
            <bindingRedirect
              oldVersion="4.0.0.0"
              newVersion="4.3.0.0"/>
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    </configuration>
    

    我希望这些信息对其他人有用。

    但是我仍然无法弄清楚如何让 fsi.exe 在运行脚本文件时打印出 Val、Reference、load 等。有什么想法吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      • 2018-10-05
      • 2020-03-15
      • 2012-05-03
      • 2011-05-01
      相关资源
      最近更新 更多