例如,我正在使用以下预处理指令

 #if COMPILED
 let context = Sql.GetDataContext(ConfigurationManager.ConnectionStrings.[AppDB].ConnectionString)
 #else
 let context = Sql.GetDataContext()
 #endif

这样我就可以从F#交互式测试dll库,给你一个想法
#I @"bin\Debug"
#r @"import.dll"
#r @"FSharp.Data.SqlProvider.dll"

#load "Library1.fs"
open SqlLib
open SqlDB

// Define your library scripting code here
let book = "My Company"
let db = DB()
db.analysts book |> Array.iter (printfn "%A")

因为,当然,在上面的示例中ConfigurationManager在脚本引擎中将无法使用,因此我需要在预处理时进行更改。

更一般地说,我在哪里可以找到文档或至少所有可用的标准符号的列表,这些符号已经自动定义,包括COMPILED等...?

最佳答案

Compiler directives F#:

您必须在命令行或项目设置中定义在if指令中使用的符号;没有定义预处理器指令...
使用-define编译器选项定义VERSION1时,将激活#if指令和#else指令之间的代码。否则,将激活#else和#endif之间的代码。

因此,您可以在编译代码时定义自己的预处理程序指令。如果使用.NET Core,则可以在fsproj或csproj中使用以下符号:

  <PropertyGroup Condition="'$(TargetFramework)' != 'net40'">
    <DefineConstants>NET45</DefineConstants>
  </PropertyGroup>
dotnet将它们发送到fsc。如果您好奇默认情况下定义了哪些符号,则可以调查fsc source code
我在那里找到了COMPILED和INTERACTIVE。

07-24 09:26
查看更多