抱歉所有长错误信息!我想知道我的Xamarin或Mono安装是否在Xamarin上打破了FSI有什么问题?默认的.Net运行时是Mono 4.6.2虽然我已经安装了Mono 4.8.0,但Xamarin运行在4.6.2上
我想知道这些错误消息是否意味着FSI没有加载System.Drawing模块?为什么 SOURCE_DIRECTORY 似乎无法正常工作? .fsx文件中没有显示错误,但加载到FSI时它不起作用。
我还安装了Visual Studio for Mac。我刚刚开始使用F#(第3天),这是我第一次尝试打开系统模块,所以我不知道它是否有用。我自己编写的基本功能将在FSI中进行评估。我正在考虑安装已被搞砸的可能性,我想知道我是否应该删除.Net,Xamarin和Mono并从头开始重新安装? Visual Studio是否可能干扰Xamarin?
通过FSharp电视简介课程我正在运行以下错误
在.fsx文件中的<#> F#:open System.Drawing
let bitmap = new Bitmap(32,32)
let path = __SOURCE_DIRECTORY__ + "/"
bitmap.Save (path + "large.png")
在FSI中加载整个代码块:
System.Exception: Generic Error [GDI+ status: GenericError]
at System.Drawing.GDIPlus.CheckStatus (System.Drawing.Status status) [0x0007a] in <1917aa1c39d94b1a91807b8cd9f03350>:0
at System.Drawing.Image.Save (System.String filename, System.Drawing.Imaging.ImageCodecInfo encoder, System.Drawing.Imaging.EncoderParameters encoderParams) [0x00043] in <1917aa1c39d94b1a91807b8cd9f03350>:0
at System.Drawing.Image.Save (System.String filename, System.Drawing.Imaging.ImageFormat format) [0x0004c] in <1917aa1c39d94b1a91807b8cd9f03350>:0
at System.Drawing.Image.Save (System.String filename) [0x00008] in <1917aa1c39d94b1a91807b8cd9f03350>:0
at (wrapper remoting-invoke-with-check) System.Drawing.Image:Save (string)
at <StartupCode$FSI_0004>.$FSI_0004.main@ () [0x0003d] in <2545683d6122431b9ff3a69ce9ec460c>:0
at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&)
at System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00038] in <8f2c484307284b51944a1a13a14c0266>:0
仅在FSI中加载 SOURCE_DIRECTORY :
val it : string = "/"
这很奇怪,因为那不是正确的路径
加载专栏:let bitmap = new Bitmap(32,32)
抛出:
Stopped due to error
System.Exception: Operation could not be completed due to earlier error
The type 'Bitmap' is not defined at 2,4
将System.Drawing发送到FSI
抛出:
Stopped due to error
System.Exception: Operation could not be completed due to earlier error
The value, constructor, namespace or type 'Drawing' is not defined at 2,7
答案 0 :(得分:2)
看起来你可能会遇到Mono bug。我发现了几个看起来像是同一个bug的报告(虽然它可能是几个不同的bug)。最有用的似乎是这个Github问题:https://github.com/gitextensions/gitextensions/issues/2226
我不知道这是否会对你有所帮助;通过从Mono 3.2.8升级到当时可用的最新Mono版本,似乎已解决了该问题。但是你已经已经运行似乎是最新版的Mono,所以“升级到最新的Mono”可能不是你问题的建议。但这是我能给出的最佳建议。
此外,在进行搜索时,我发现有几个人抱怨libgdiplus
(Mono的GDIPlus API实现)以各种方式出错。因此,如果您无法让System.Drawing
工作,我可以跳过libgdiplus
示例并转到本教程的其他部分。
P.S。以下是我在回答您的问题时首先编写的内容,但随后我进行了实验,发现System.Drawing
命名空间自动加载到F#脚本中而无需显式打开它。尽管如此,作为一个F#初学者,你可能会发现下面的信息在其他环境中很有用,所以我把它留在了。请注意我在下面所说的关于System.Drawing
没有自动打开的内容是错误的。< / p>
-----不太正确的答案如下-----
在.fsx
文件中编写F#脚本时,您不能只执行open (namespace)
。您还必须告诉F#在哪里找到具有该命名空间的.DLL。在已编译的项目(使用.fs
文件)中,该信息可在.fsproj
文件中找到。但对于F#脚本(.fsx
格式),没有项目文件,因此脚本本身需要指定要加载的DLL。您可以通过#r
指令执行此操作:
#r "/path/to/library.dll"
或者,如果您正在加载的DLL安装在标准系统位置(如GAC(全局程序集缓存))中,您可以离开路径并执行:
#r "library.dll"
每当您运行F#脚本时,都会自动加载一些DLL,例如包含mscorlib.dll
命名空间之类的System
。但System.Drawing
命名空间不是那些自动加载的DLL之一。因此,在打开System.Drawing
命名空间之前,您必须输入相应的#r
引用,如下所示:
#r "System.Drawing.dll"
open System.Drawing