在AssemblyOne中定义的函数调用了在AssemblyTwo中定义的函数:
namespace AssemblyOne
[<RequireQualifiedAccess>]
module MyModuleA =
let FetchResult id =
let result = AssemblyTwo.MyModuleC.FetchResult id
result
在AssemblyTwo
中调用的函数调用了同一程序集中的另一个函数 (FetchActualResult()
),该函数接受一个类型为MyCSharpType
参数,该类型属于所引用的C# DLL (MyCSharpLib
):
namespace AssemblyTwo
[<RequireQualifiedAccess>]
module MyModuleB =
let FetchActualResult(myCSharpType:MyCSharpLib.MyCSharpType, id:int)
//return a result
[<RequireQualifiedAccess>]
module MyModuleC =
let FetchResult id =
let myCSharpType = new MyCSharpLib.MyCSharpType()
MyModuleB.FetchActualResult(myCSharpType, id)
这个解决方案在Visual Studio中可以编译和构建;但是,当我们尝试使用MSBuild从命令行构建项目时,构建失败,并在msbuild.log中显示以下错误:
error FS0074: The type referenced through 'MyCSharpLib' is defined in an assembly that is not referenced. You must add a reference to assembly 'MyCSharpLib'.
MyCSharpLib
在AssemblyTwo
的FetchActualResult()
函数签名中作为参数暴露出来所引起的错误,导致现在AssemblyOne
需要引用MyCSharpLib
,即使AssemblyOne
并没有直接使用MyCSharpLib
中的任何内容。如果我们从函数签名中删除此参数,则解决方案将无错误构建。
我们通过复制代码来进一步探索这个问题,具有以下用例(“->”表示程序集引用):
- F#
AssemblyOne
-> F#AssemblyTwo
->MyCSharpLib
(C# DLL)(无法构建) - F#
AssemblyOne
-> F#AssemblyTwo
->MyFSharpLib
(F# DLL)(无法构建) - F#
AssemblyOne
-> F#AssemblyTwo
-> C#AssemblyThree
(在同一解决方案中的程序集)(无法构建) - F#
AssemblyOne
-> F#AssemblyTwo
-> F#AssemblyThree
(在同一解决方案中的程序集)(构建成功)
这种行为可以解释吗?
FSharp.Core.dll
?(2) 它们是否都编译为相同的目标框架? - Tomas PetricekFSharp.Core.dll
- 版本为 4.3.0.0;(2) 所有程序集的目标框架均为 v4.5。 - daithimurfMyModuleA.FetchActualResult
实际上应该是MyModuleB.FetchActualResult
,但我可能还没有完全理解情况。 - DWright