2016-02-21 3 views
2

Таким образом, я пытался получить этот простой тест, работающий в приложении # консоли F:F # и MEF: Экспорт Функции

open System.Reflection 
open System.ComponentModel.Composition 
open System.ComponentModel.Composition.Hosting 

[<Export(typeof<int -> string>)>] 
let toString(i: int) = i.ToString() 

[<EntryPoint>] 
let main argv = 
    use catalog = new AssemblyCatalog(Assembly.GetEntryAssembly()) 
    use container = new CompositionContainer(catalog) 

    let myFunction = container.GetExportedValue<int -> string>() 
    let result = myFunction(5) 
    0 

Я ожидал, MEF, чтобы функция должным образом решена, но это не так. Вместо этого, я получаю это:

Необработанное исключение типа 'System.ComponentModel.Composition.CompositionContractMismatchException' произошло в System.ComponentModel.Composition.dll

Дополнительная информация:

Cannot cast the underlying exported value of type 'Program.toString (ContractName="Microsoft.FSharp.Core.FSharpFunc(System.Int32,System.String)")' to type 'Microsoft.FSharp.Core.FSharpFunc``2[System.Int32,System.String]'.

  • Что мне здесь не хватает?
  • В чем разница между FSharpFunc(System.Int32, System.String) и FSharpFunc``2[System.Int32, System.String]?
  • Каков правильный способ импорта/экспорта функций F # через MEF?

ответ

3

Компилятор превращает верхнего уровня F # функции в методах, так что ваш пример будет скомпилирован как:

[Export(FSharpFunc<int,string>)] 
public string toString(int i) { return i.ToString(); } 

Это, вероятно, вызывает ошибку. Вы можете заставить компилятор производить свойство добытчик FSharpFunc типа, вызвав какую-то операцию, которая возвращает функцию - даже тождественная функция наденет:

let makeFunc f = f 

[<Export(typeof<int -> string>)>] 
let toString = makeFunc <| fun (i:int) -> 
    i.ToString() 

Я не проверял, но я думаю, что она могла бы работать. Тем не менее, в этом случае, вероятно, безопаснее использовать простой интерфейс с одним методом.

+0

Спасибо за ваш ответ. Я просто пытаюсь избавиться от интерфейсов. Я полагал, что для большинства моих кодов нужны только фактические функции, а не содержащие типы или любые материалы интерфейса. –

+0

Также: вы упомянули, что это только для функций верхнего уровня, не так ли? что, если я поместил все мои '[]' ed функции как вложенные функции? –

+0

... Арг .. Правильно. Я не могу применять атрибуты к вложенным функциям. Есть ли какая-либо MEF-подобная библиотека, которая будет играть лучше с F #, но все же сможет быть использована кодом C#? –

Смежные вопросы