У нас есть сборка F # (AssemblyOne
), которая ссылается на другую сборку F # (AssemblyTwo
) в одном решении Visual Studio 2012. AssemblyTwo
имеет ссылку на С# DLL (MyCSharpLib
).
Функция, определенная в AssemblyOne
, вызывает функцию, определенную в AssemblyTwo
:
namespace AssemblyOne
[<RequireQualifiedAccess>]
module MyModuleA =
let FetchResult id =
let result = AssemblyTwo.MyModuleC.FetchResult id
result
Функция, вызываемая в AssemblyTwo
, вызывает другую функцию (FetchActualResult()
) в той же самой сборке, которая принимает параметр типа MyCSharpType
, который принадлежит ссылочной С# 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
в сигнатуре функции FetchActualResult()
в AssemblyTwo
, вызывает ошибку.
AssemblyOne
теперь требуется ссылка на MyCSharpLib
, хотя AssemblyOne
напрямую не использует ничего из MyCSharpLib
.
Если мы удалим параметр из сигнатуры функции, решение будет построено без ошибок.
Мы дополнительно исследовали эту проблему, реплицируя код в следующих случаях использования ('- > ' указывает ссылку на сборку):
- F #
AssemblyOne
→ F #AssemblyTwo
→MyCSharpLib
(С# DLL) (не создается) - F #
AssemblyOne
→ F #AssemblyTwo
→MyFSharpLib
(F # DLL) (не создается) - F #
AssemblyOne
→ F #AssemblyTwo
→ С#AssemblyThree
(сборка в том же решении) (не создается) - F #
AssemblyOne
→ F #AssemblyTwo
→ F #AssemblyThree
(сборка в том же решении) (строит)
Можно ли объяснить это поведение?