2012-04-09 4 views
8

Soweit ich verstehe, wird F # Typ Provider immer eine nicht-portable Klassenbibliothek (zB wird es Reflection.Emit verwenden, die nicht in WinRT verfügbar ist). Um es in meiner F # -Klassenbibliothek zu verwenden, muss ich einen Verweis auf die Type-Provider-DLL hinzufügen, damit die Bibliothek nicht kompilierbar sein muss.Portable Bibliotheken mit Typ Provider

In diesem Fall bin ich glücklich, in eine tragbare Baugruppe zu trennen und eine, die den Typ Provider verwendet. Die einzige Möglichkeit, dies zu kompilieren, ist das Hinzufügen eines Verweises auf Fsharp.Core zu meinem C# -Anwendungsprojekt (.NET 4.5) - aber zur Laufzeit gibt es immer noch einen Konflikt zwischen den Versionen von FSharp.Core.

{"Could not load file or assembly 'FSharp.Core, Version=2.3.5.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.":"FSharp.Core, Version=2.3.5.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"} 

Kann ich den Konflikt lösen, bin ich falsch Typ-Anbieter verwenden, oder ist es etwas, das noch werden kann, nicht getan?

Antwort

8

Sie benötigen eine verbindliche Umleitung in Ihrer app.config-Datei. Wenn Sie ein neues F # -Projekt erstellen, die 4,5 Ziele wird es

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
     <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> 
     <bindingRedirect oldVersion="2.3.5.0" newVersion="4.3.0.0"/> 
    </dependentAssembly> 
    </assemblyBinding> 
</runtime> 

in der app.config haben. Sie müssen das in der app.config des letzten ausführenden Exe-Projekts (z. B. der C# one) hinzufügen, so dass z. Wenn Sie es auf dem Desktop ausführen, löst es das portable FSharp.Core (2.3.5.0) auf den Desktop (4.3.0.0) auf.

+0

Brilliant, das funktioniert perfekt. –