Как создать провайдер типа F#, который можно использовать из C#?
Если я использую провайдеров F# -типа из сборки FSharp.Data.TypeProviders 4.3.0.0, я могу создавать типы в очень простой библиотеке F#. Затем я могу использовать эти типы без какой-либо зависимости от сборки FSharp.Data.TypeProviders. Это довольно мило! Вот пример:
Я создал проект библиотеки F# под названием TryTypeProviders. Я положил это в.fs:
module TryTypeProviders
type Northwind = Microsoft.FSharp.Data.TypeProviders.ODataService
Затем я могу использовать библиотеку F# из проекта 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);
}
Я не смог найти ни одного рабочего примера того, как создать поставщика типов, подобного этому. Поставщики типов в FSharpx.TypeProviders недоступны из C#. Я предполагаю, что это стертые типы, а не сгенерированные типы. Я все еще немного неясен, на котором есть, но это определяется здесь как:
- Генерируемые типы - это настоящие типы.NET, которые внедряются в сборку, в которой используется поставщик типов (это те, которые используют поставщики типов, которые используют такие инструменты генерации кода, как sqlmetal)
- Стираемые типы - это симулированные типы, которые представляются другим типом при компиляции кода.
Образцы из пакета образцов F# 3.0, упомянутые в руководстве MSDN, не работают для меня. Они строят, но когда я пытаюсь использовать их, я получаю ошибки.
open Samples.FSharp.RegexTypeProvider
type PhoneNumberRegEx = CheckedRegexProvider< @"(?<AreaCode>^\d{3})-(?<PhoneNumber>\d{3}-\d{4}$)">
open Samples.FSharp.MiniCsvProvider
type csv = MiniCsvProvider<"a.csv">
Последний раз он был выпущен в марте 2011 года, и я предполагаю, что они еще не отражают окончательную версию поставщиков типов, поставляемую с Visual Studio 2012.
Поставщики F# Type выглядят как отличная технология, но нам нужна помощь в их создании. Любая помощь приветствуется.
1 ответ
Причина, по которой поставщики стандартных типов (для OData, LINQ to SQL и WSDL) работают с C#, заключается в том, что они создают реальные.NET-типы под прикрытием. Это называется генеративным типом провайдера. Фактически, они просто вызывают инструмент генерации кода, который вызывался бы, если бы вы использовали эти технологии из C# стандартным способом. Таким образом, эти поставщики типов являются просто обертками над некоторыми стандартными инструментами.NET.
Большинство вновь написанных провайдеров написаны как провайдеры стирающего типа. Это означает, что они генерируют только "поддельные" типы, которые сообщают компилятору F#, какие члены могут быть вызваны (и т. Д.), Но когда компилятор их компилирует, "поддельные" типы заменяются другим кодом. По этой причине вы не можете видеть какие-либо типы, когда используете библиотеку из C# - ни один из этих типов фактически не существует в скомпилированном коде.
Если вы не переносите существующий генератор кода, проще написать провайдера стертых типов, и поэтому большинство примеров написано таким образом. У провайдеров стирания типов есть и другие преимущества - то есть они могут генерировать огромное количество "поддельных" типов, не создавая слишком больших сборок.
В любом случае, в руководстве MSDN есть краткое примечание "Предоставление сгенерированных типов", в котором есть некоторые советы по написанию генеративных провайдеров. Тем не менее, я ожидаю, что большинство новых провайдеров типа F# будут написаны как стирающие. Он отмечает, что у вас должна быть настоящая сборка.NET (со сгенерированными типами) и ее получение, что не упрощается помощниками F# для построения поставщиков типов - поэтому вам нужно испустить IL для сборки или сгенерировать код C#/F# и скомпилируйте это (то есть используя CodeDOM или Roslyn).