2014-01-06 123 views
0

我试图按照此LINK http://msdn.microsoft.com/en-us/library/hh361033.aspx通过SqlDataConnection从通过命令行fsx.exe触发的F#脚本运行数据库查询。从命令行运行F#脚本时缺少名称空间

虽然我从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交互式窗口上打印相同的信息以打印在命令行窗口上?

问候 casbby

回答

1

Linq命名空间中System.Core.dll主要定义。我猜测,在VS交互式窗口中,这隐式地导入,因此您的脚本工作,并且它不会在FSI中隐式导出。无论哪种方式,你应该能够通过将下面的脚本

#r "System.Core.dll" 
+0

嗨JaredPar,我试过你的建议,但它没有帮助。然而,自那之后,我就偶然发现了根本原因。这是由于fsi.exe的配置。不知何故,它加载了F#2.0库。 – casbby

0

我莫名其妙地在这个问题的根本原因,跌跌撞撞地解决这个问题:没有定义的LINQ库的原因是,当我运行fsi.exe从命令行加载F#V2.0核心库。

因为当我试图从命令行执行fsi.exe myScript.fsx时,Val,Reference和Load信息没有输出打印到标准输出,我尝试直接通过运行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)的\微软F#\ V4.0 (这是我在PATH通过以下F#博客文章可能是过时的) 和

C:\ Program Files文件(x86)的\微软的SDK \ F#\ 3.0 \框架\ v4.0的 (这是什么VS2012使用)

O这两个位置之间的关键区别在于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。在运行脚本文件时打印出Val,Reference,load等。任何想法?