Mamy zespół F # (AssemblyOne
), który odwołuje się do innego zestawu F # (AssemblyTwo
) w pojedynczym rozwiązaniu Visual Studio 2012. AssemblyTwo
ma odniesienie do biblioteki DLL C# (MyCSharpLib
).Referencje zespołu F # powodujące problemy z kompilacją?
funkcji określonej w AssemblyOne
wywołuje funkcję zdefiniowaną AssemblyTwo
:
namespace AssemblyOne
[<RequireQualifiedAccess>]
module MyModuleA =
let FetchResult id =
let result = AssemblyTwo.MyModuleC.FetchResult id
result
Funkcja zwana w AssemblyTwo
wywołuje inną funkcję (FetchActualResult()
) w tym samym zespole, który przyjmuje parametr typu MyCSharpType
należącego do odpowiedniej 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)
rozwiązanie kompiluje i buduje w Visual Studio; Jednak, gdy staramy się zbudować projekt z linii poleceń za pomocą programu MSBuild, kompilacja zakończy się niepowodzeniem, z powodu następującego błędu w 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'.
Wydaje typ odsłoniętą jako parametr z MyCSharpLib
w FetchActualResult()
Podpis funkcji w AssemblyTwo
powoduje błąd. AssemblyOne
wymaga teraz odniesienia do MyCSharpLib
, mimo że AssemblyOne
nie korzysta bezpośrednio z niczego od MyCSharpLib
. Jeśli usuniemy parametr z podpisu funkcji, rozwiązanie zostanie zbudowane bez błędów.
Mamy dokładniej zbadać ten problem poprzez replikację kod z następujących przypadków użycia ('->' oznacza odniesienie montaż):
- F #
AssemblyOne
-> F #AssemblyTwo
->MyCSharpLib
(C# DLL) (robi nie budować) - F #
AssemblyOne
-> F #AssemblyTwo
->MyFSharpLib
(F # DLL) (nie tworzy) - F #
AssemblyOne
-> F #AssemblyTwo
-> C#AssemblyThree
(montaż w tym samym roztworze) (czy N ot build) - F #
AssemblyOne
-> F #AssemblyTwo
-> F #AssemblyThree
(montaż w tym samym roztworze) (buduje)
Czy takie zachowanie można wytłumaczyć?
Nie jestem pewien, co to powoduje, ale zwykle można sprawdzić, czy (1) czy wszystkie odnoszą się do tej samej wersji 'FSharp.Core.dll? (2) Czy są one zestawiane dla tych samych ram docelowych? –
(1) wszystkie one odnoszą się do tej samej wersji 'FSharp.Core.dll' - wersja 4.3.0.0 i (2) wszystkie struktury złożeń zestawu v4.5 – daithimurf
Czy jesteś pewien, że używasz tej samej wersji MSBuild, której używa VS ? Czy możesz gdzieś umieścić pełny dziennik MSBuild? – skolima