f# - una - preguntas para renovacion de licencia tipo f
¿Cómo creo un proveedor de tipo F#que pueda usarse desde C#? (1)
La razón por la que los proveedores de tipo estándar (para OData, LINQ to SQL y WSDL) trabajan con C # es que generan tipos de .NET reales detrás de la cubierta. Esto se llama proveedor de tipo generativo . De hecho, simplemente llaman a la herramienta de generación de código que se llamaría si estuviera usando estas tecnologías de C # de manera estándar. Por lo tanto, estos proveedores de tipo son simplemente envoltorios sobre algunas herramientas estándar de .NET.
La mayoría de los proveedores que se han escrito recientemente se escriben como proveedores de tipos de borrado . Esto significa que solo generan tipos "falsos" que le dicen al compilador F # cómo se puede llamar a los miembros (etc.) pero cuando el compilador los compila, los tipos "falsos" se reemplazan con algún otro código. Esta es la razón por la que no puede ver ningún tipo cuando está utilizando la biblioteca de C #; ninguno de los tipos existe realmente en el código compilado.
A menos que esté envolviendo el generador de código existente, es más fácil escribir un proveedor de tipos borrados y, por lo tanto, la mayoría de los ejemplos están escritos de esta manera. Los proveedores de tipos de borrado tienen otros beneficios, es decir, pueden generar un gran número de tipos "falsos" sin generar ensamblajes excesivamente grandes.
De todos modos, hay una breve nota tutorial , que tiene algunos consejos sobre cómo escribir proveedores generativos. Sin embargo, esperaría que la mayoría de los nuevos proveedores de tipo F # se escriban como borrados. Indica que debe tener un ensamblaje .NET real (con los tipos generados) y que los ayudantes de F # no simplifican los proveedores de tipo de construcción, por lo que deberá emitir el IL para el ensamblaje o generar el código C # / F # y compile eso (es decir, usando CodeDOM o Roslyn).
Si uso los proveedores de tipos F # del ensamblaje FSharp.Data.TypeProviders 4.3.0.0, puedo crear tipos en una biblioteca F # muy simple. Entonces puedo usar esos tipos sin ninguna dependencia en el ensamblaje FSharp.Data.TypeProviders. ¡Eso es muy dulce! Aquí hay un ejemplo:
Creé un proyecto de biblioteca F # llamado TryTypeProviders. Pongo esto en el .fs:
module TryTypeProviders
type Northwind = Microsoft.FSharp.Data.TypeProviders.ODataService
Entonces puedo usar la biblioteca F # de un proyecto C #:
public static void Main()
{
var c = new TryTypeProviders.Northwind();
foreach (var cust in c.Customers)
Console.WriteLine("Customer is: " + cust.ContactName);
Console.ReadKey(true);
}
No he podido encontrar ningún ejemplo práctico de cómo crear un proveedor de tipos como este. Los proveedores de tipos en FSharpx.TypeProviders no son accesibles desde C #. Mi conjetura es que son tipos borrados y no tipos generados. Todavía estoy un poco confuso en cuál es cuál, pero se define aquí como :
- Los tipos generados son tipos .NET reales que se incorporan al ensamblaje que usa el proveedor de tipo (esto es lo que los proveedores de tipo que envuelven herramientas de generación de código como el uso de sqlmetal)
- Los tipos borrados son tipos simulados que están representados por algún otro tipo cuando se compila el código.
Las muestras del paquete de muestra F # 3.0 que se mencionan en el tutorial MSDN no funcionan para mí. Ellos construyen, pero cuando trato de usarlos obtengo errores.
open Samples.FSharp.RegexTypeProvider
type PhoneNumberRegEx = CheckedRegexProvider< @"(?<AreaCode>^/d{3})-(?<PhoneNumber>/d{3}-/d{4}$)">
open Samples.FSharp.MiniCsvProvider
type csv = MiniCsvProvider<"a.csv">
Se lanzó por última vez en marzo de 2011 y supongo que aún no reflejan la versión final de los proveedores de tipos que se enviaron con Visual Studio 2012.
Los Proveedores de Tipo F # parecen una gran tecnología, pero necesitamos ayuda para construirlos. Cualquier ayuda es apreciada.