黑客引用的程序集

时间:2013-12-03 09:03:11

标签: f# assemblies

我知道关于这个主题还有其他问题,例如:

..但是,嘿,我是F#的新手,但仍然没有得到它。

我有一个包含一些模块的F#项目(thelibrary)。该项目在解决方案资源管理器中引用了所有必需的库。每个.fs文件都会打开模块中使用的库。 F#项目编译正确。

然后我有另一个包含脚本的F#项目。我引用thelibrarythelibrary本身使用的库。在脚本中,我使用#r引用带有thelibrary的dll以及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'.

解决此问题的程序是什么?我该如何从那里出发? 我感兴趣的是这个特定问题的解决方案,但是,还有一个食谱方法来解决这类问题,这些问题一直是我的挫折感。

谢谢。

3 个答案:

答案 0 :(得分:6)

在这种情况下,F#Interactive的行为可能有点奇怪。通常,我认为当您使用#I在分辨率上下文中包含引用程序集的路径,然后使用#r按名称引用库时,事情会更好。因此,如果您在Fmat.Numerics.dll文件夹中有一个库C:\libs并且它引用了另一个库another.dll,那么您可以这样做:

#I "C:\\libs"
#r "another.dll"
#r "Fmat.Numerics.dll`

第一行意味着F#Interactive将自动查找包含库的文件夹(这也可以是脚本位置的相对路径) - 因此,接下来的两行只能通过文件名引用库。

答案 1 :(得分:5)

这仍然是一个问题。我也可以按如下方式重现并解决问题:

我有三个项目:

  1. Informedica.Settings.Library
  2. Informedica.Settings.Services.Interfaces
  3. Informedica.Settings.Services.Models
  4. 项目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"
    

    一切正常。不幸的是,当我使用VS2013发送对fsi的引用或使用新的电动工具生成引用选项时,顺序是:

    #r @"..\..\Informedica.Settings.Library\bin\Release\Informedica.Settings.Library.dll"
    #r @"..\..\Informedica.Settings.Services.Models\bin\Release\Informedica.Settings.Services.Models.dll"
    

    这将导致FS0074错误。显然,因为Services.Models中的一个类型在Settings.Library中使用,并且引用顺序相反,所以fsi无法处理此问题。纠正引用顺序可以解决问题。

答案 2 :(得分:2)

在fsi中运行东西不会添加项目的引用,您需要使用#r ...。您需要做的事情中相当明显的错误消息 - 添加对Fmat.Numerics的引用。您也可能有这样的引用,但fsi对加载顺序很敏感。