Pregunta

As far as I understand, F# type provider is always going to be a non-portable class library (eg it will use Reflection.Emit which is not available in WinRT). To use it in my F# class library, I need to add a reference to the type provider DLL, so that library has to be non-portable to compile.

In this case I'm happy to separate into one portable assembly and one which uses the type provider. The only way I can get this to compile is by adding a reference to Fsharp.Core to my C# application project (.NET 4.5) - but at runtime there is still a conflict between the versions of 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"}

Can I resolve the conflict, am I using type providers wrongly, or is it something that can't be done yet?

¿Fue útil?

Solución

You need a binding redirect in your app.config file. If you create a new F# project that targets 4.5 it will have

<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 the app.config. You need to add that in the app.config of the final consuming exe project (e.g. the C# one), so that e.g. if you run it on the desktop, it will resolve the portable FSharp.Core (2.3.5.0) to the desktop one (4.3.0.0).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top