У нас есть сборка 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(сборка в том же решении) (строит)
Можно ли объяснить это поведение?