Wir haben eine F # -Assembly (AssemblyOne
), die eine andere F # -Assembly (AssemblyTwo
) in einer einzigen Visual Studio 2012-Lösung referenziert. AssemblyTwo
verweist auf eine C# -DLL (MyCSharpLib
).F # Assembly-Referenzen, die Build-Probleme verursachen?
eine Funktion in AssemblyOne
definiert ruft eine Funktion in AssemblyTwo
definiert:
namespace AssemblyOne
[<RequireQualifiedAccess>]
module MyModuleA =
let FetchResult id =
let result = AssemblyTwo.MyModuleC.FetchResult id
result
Die in AssemblyTwo
aufgerufenen Funktion ruft eine andere Funktion (FetchActualResult()
) in der gleichen Anordnung, die einen Parameter vom Typ nimmt MyCSharpType
, die die referenzierten gehört 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)
Die Lösung erstellt und baut in Visual Studio; jedoch, wenn wir versuchen, das Projekt von der Kommandozeile zu bauen MSBuild verwenden, die Build fehlschlägt, mit dem folgenden Fehler in den 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'.
Es scheint, den Typen als Parameter ausgesetzt von MyCSharpLib
im FetchActualResult()
Funktionssignatur in AssemblyTwo
verursacht den Fehler. AssemblyOne
benötigt jetzt einen Verweis auf MyCSharpLib
, obwohl AssemblyOne
nicht direkt irgendetwas aus MyCSharpLib
verwendet. Wenn wir den Parameter aus der Funktionssignatur entfernen, wird die Lösung fehlerfrei aufgebaut.
Wir dieses Problem weiter erforscht haben, indem Sie den Code mit den folgenden Anwendungsfälle zu replizieren ('->' bezeichnet das Bezugs assembly):
- # F
AssemblyOne
-> F #AssemblyTwo
->MyCSharpLib
(C# DLL) (tut bauen nicht) - F #
AssemblyOne
-> F #AssemblyTwo
->MyFSharpLib
(F # DLL) (bauen sich nicht) - F #
AssemblyOne
-> F #AssemblyTwo
-> C#AssemblyThree
(Montage in derselben Lösung) (DOE n ot build) - F #
AssemblyOne
-> F #AssemblyTwo
-> F #AssemblyThree
(Montage in derselben Lösung) (baut)
kann dieses Verhalten zu erklären?
Ich bin nicht sicher, was das verursacht, aber die üblichen Dinge, die Sie überprüfen können, sind (1) beziehen sich alle auf die gleiche Version von 'FSharp.Core.dll'? (2) Sind sie für den gleichen Zielrahmen zusammengestellt? –
(1) sie alle verweisen auf die gleiche Version von 'FSharp.Core.dll' - Version 4.3.0.0 und (2) alle Assemblys target framework v4.5 – daithimurf
Sind Sie sicher, dass Sie die gleiche MSBuild-Version verwenden, die VS verwendet ? Könnten Sie irgendwo ein vollständiges MSBuild-Protokoll veröffentlichen? – skolima