我知道关于这个主题还有其他问题,例如:
..但是,嘿,我是F#的新手,但仍然没有得到它.
我有一个F#project(thelibrary),它包含一些模块.该项目在解决方案资源管理器中引用了所有必需的库.每个.fs文件都会打开模块中使用的库.F#项目编译正确.
然后我有另一个包含脚本的F#项目.我引用thelibrary和thelibrary自己使用的库.在脚本中,我引用#r了dll thelibrary以及所使用的所有库thelibrary.然后open是我所有的模块.Intellisense说在我执行脚本之前一切都很好.
该脚本返回错误:
error FS0074: The type referenced through 'Fmat.Numerics.Matrix`2' is defined in an assembly that is not referenced. You must add a reference to assembly 'Fmat.Numerics'.
Run Code Online (Sandbox Code Playgroud)
破解这个问题的程序是什么?我该如何从那里出发?我感兴趣的是这个特定问题的解决方案,但同样,一个菜谱配方来解决这类问题,这对我来说是一个令人沮丧的原因.
谢谢.
在这种情况下,F#Interactive的行为可能有点奇怪.通常,我认为当您使用#I在分辨率上下文中包含引用程序集的路径然后使用名称引用库时,事情会更好#r.因此,如果您Fmat.Numerics.dll在一个文件夹中有一个库C:\libs并且它引用了另一个库,another.dll那么您可以:
#I "C:\\libs"
#r "another.dll"
#r "Fmat.Numerics.dll`
Run Code Online (Sandbox Code Playgroud)
第一行意味着F#Interactive将自动查看包含库的文件夹(这也可以是脚本位置的相对路径) - 因此,接下来的两行只能通过文件名引用库.
这仍然是个问题.我还可以重现并修复问题,如下所示:
我有三个项目:
项目2使用项目1和项目3.项目1使用项目3.
当我按顺序加载引用时(第一个proj 3然后是proj 1):
#r @"..\..\Informedica.Settings.Services.Models\bin\Release\Informedica.Settings.Services.Models.dll"
#r @"..\..\Informedica.Settings.Library\bin\Release\Informedica.Settings.Library.dll"
Run Code Online (Sandbox Code Playgroud)
一切正常.不幸的是,当我使用VS2013发送对fsi的引用或使用新的电动工具生成引用选项时,顺序是:
#r @"..\..\Informedica.Settings.Library\bin\Release\Informedica.Settings.Library.dll"
#r @"..\..\Informedica.Settings.Services.Models\bin\Release\Informedica.Settings.Services.Models.dll"
Run Code Online (Sandbox Code Playgroud)
这将导致FS0074错误.显然,因为Services.Models中的一个类型在Settings.Library中使用,并且引用顺序相反,所以fsi无法处理此问题.更正引用顺序可以解决问题.