【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

VWD2010でF#

SilverlightでF#を使用する場合、Visual Studio 2010 ProfessionalではC# SilverlightアプリケーションとF# Silverlightクラスライブラリを組み合わせる方法が推奨されているようです。

フリーのVisual Web Developer 2010 Express Edition(以下VWD)で試行錯誤した結果、小細工でF#がビルドできることが分かりました。

  1. C# Silverlightアプリケーションのソリューションを作成します。
  2. C# Silverlightクラスライブラリのプロジェクトを追加します。
  3. クラスライブラリプロジェクトを書き換えてF#用にします。
  4. アプリケーションからクラスライブラリを参照します。

3と4の詳細は以下の通りです。

クラスライブラリプロジェクトの書き換え

VWDを終了します。クラスライブラリ内のcsファイルを削除します。

以下の内容でModule1.fsファイルを追加します。

module Module1

csprojファイルを開いて、以下のように書き換えます。
※行頭の+は追加、-は削除を意味します。(unified diff形式)

--- SilverlightClassLibrary1.csproj.orig
+++ SilverlightClassLibrary1.csproj
@@ -46,6 +46,7 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="FSharp.Core" />
     <Reference Include="mscorlib" />
     <Reference Include="System.Windows" />
     <Reference Include="system" />
@@ -55,10 +56,9 @@
     <Reference Include="System.Windows.Browser" />
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="Class1.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Module1.fs" />
   </ItemGroup>
-  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Silverlight\$(SilverlightVersion)\Microsoft.Silverlight.CSharp.targets" />
+  <Import Project="$(MSBuildExtensionsPath32)\FSharp\1.0\Microsoft.FSharp.Targets" />
   <ProjectExtensions>
     <VisualStudio>
       <FlavorProperties GUID="{A1591282-1198-4647-A2B1-27E5FF5F6F3B}">

ソリューションを開きます。

F#のクラスライブラリのプロパティで以下の参照パスを追加します。

C# Silverlightアプリケーションの参照設定にF#クラスライブラリを追加します。

以上でC# SilverlightアプリケーションにF#クラスライブラリの組み込みが完了です。

テスト

C#からF#を呼び出して画面に表示してみます。

Module1.fsに以下の行を追加します。

let hello = "Hello, F#!"

MainPage.xamlのデザイナを開いてTextBoxを追加します。MainPage.xaml.csのコンストラクタに以下の行を追加します。

textBox1.Text = Module1.hello;

これを実行すると画面に Hello, F#! と表示されるはずです。

制限事項

  • F#へのインテリセンスや色付けなどの支援機能は利用できません。
  • ブレークポイントの設定や、例外発生時に該当箇所へ飛ぶことは可能です。
  • F#のソースはテキストファイルとして扱われるため、デフォルトではインデントにタブが使用されます。F#はインデントにタブを受け付けないため、設定で「空白の挿入」に切り替える必要があります。
  • F#ではソース単位での後方参照が義務付けられているため、ソースのビルド順が重要な意味を持ちます。VWDではビルド順を指定することができないため(Visual F#では可能)、プロジェクトに記載された順番でしかビルドできません。順番を変更するにはプロジェクトファイルを直接書き換えてください。

このように開発で使用するのはかなり厳しいです。フリーな環境でもビルドできるという以上のものではありません。実際の開発ではViewを分離して、Windows Formsなどと組み合わせてVisual Studio 2008 Shellで行い、Viewの組み換えとしてSilverlightに持って行くのが現実的だと思います。

Professionalを購入するのが一番簡単ではありますが・・・。