Во время отладки приложения F # я хотел бы иметь возможность вызывать метод F # из непосредственного окна VS2010, но, похоже, он не работает. Проблема заключается в том, что методы F# на самом деле являются объектами FSharpFunc. Я попытался использовать метод «Вызвать», но интерактивное окно не распознает его.
Как вызвать функцию F# из непосредственного окна VS2010
- Несколько дней назад я отправил предложение в MS Connect по этому поводу: connect.microsoft.com/VisualStudio/feedback/details/574242/ 24.07.2010
- Это кажется проблемой только в том случае, если у вас есть функция с одним аргументом. Я могу вызвать функцию с несколькими (каррированными) аргументами непосредственно из непосредственного окна с тем же синтаксисом, что и C#. 26.07.2010
Ответы:
Интеграция F# для Visual Studio не поддерживает выражения F# в непосредственном окне (или наблюдениях), поэтому единственный вариант — написать код C#, соответствующий скомпилированному представлению, которое использует F#. Я попытался это сделать, и у меня возникла та же проблема, что и вы описали: метод Invoke
кажется там (в Reflector), но Visual Studio не хочет вызывать его напрямую. Я попробовал это на следующем примере:
let foo f =
let n = f 1 2 // Breakpoint here
n + 1
Однако есть и другие способы вызова функции. В этом случае фактический код, сгенерированный компилятором F#, представляет собой вызов метода InvokeFast
. Если вы наберете следующее в непосредственном окне, это сработает:
Microsoft.FSharp.Core.FSharpFunc<int, int>.InvokeFast<int>(f, 1, 2) |
Также кажется, что вы можете вызвать обычный метод Invoke
, используя dynamic
из C# 4.0 (доказывая, что метод действительно существует!):
((dynamic)f).Invoke(1, 2)
Это работает, только если вы добавите ссылку на Microsoft.CSharp.dll
(и используете некоторый тип, определенный в сборке, где-то в вашем коде, например, в качестве аннотации, чтобы он загружался).
InvokeFast
должен работать безMicrosoft.CSharp.dll
(хотя, возможно, нужно что-то сделать, чтобы непосредственное окно загружалоFSharp.Core.dll
). Библиотека C# нужна только дляdynamic
. 24.07.2010