F#で作成したDLLにアセンブリ情報を付与する、というお話

F# Advent Calendar jp 2010

このエントリはF# Advent Calendar jp 2010 : ATNDの第10回のものです。

環境

を利用しております。その他の環境では確認しておりませんのでご了承下さい。

アセンブリ情報

F#でビルドしたDLLのプロパティを見ると、大抵は以下のように「詳細」は空白がちになっていると思います。

これらはアセンブリ情報などと呼ばれる物で、製品として出荷する場合は必須なものです。

例えば、C#なんかでは以下のようにIDEから設定(プロジェクトの「プロパティ」→「アプリケーション」→「アセンブリ情報(I)...」)できるのですが、

F#のIDEには残念ながらアセンブリ情報を設定できる機能は、まだ実装されていません。

もちろん、C#アセンブリ情報は、AssemblyInfo.csという名前のファイルに記述されていますので、このファイルに値するものを設定すればよいのです。
しかし、F#のプロジェクト開始時には、AssemblyInfo.fs なんてありません。作りましょう。
名前はC#のものを踏襲して、AssemblyInfo.fs とでもしておきましょう。
以下が、AssemblyInfo.fs の全文です。

module AssemblyInfo

#light
open System.Reflection
open System.Runtime.CompilerServices
open System.Runtime.InteropServices

(* アセンブリに関する一般情報は以下の属性セットをとおして制御されます。
   アセンブリに関連付けられている情報を変更するには、
   これらの属性値を変更してください。 *)
[<assembly: AssemblyTitle("Library1")>]
[<assembly: AssemblyDescription("")>]
[<assembly: AssemblyConfiguration("")>]
[<assembly: AssemblyCompany("")>]
[<assembly: AssemblyProduct("Library1")>]
[<assembly: AssemblyCopyright("Copyright")>]
[<assembly: AssemblyTrademark("")>]
[<assembly: AssemblyCulture("")>]

(* ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから
   参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、
   その型の ComVisible 属性を true に設定してください。*)
[<assembly: ComVisible(false)>]

(* 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です *)
[<assembly: Guid("7348f737-981a-43dc-924f-6d6e7eb8e3de")>]

(* アセンブリのバージョン情報は、以下の 4 つの値で構成されています:

        Major Version
        Minor Version
        Build Number
        Revision

   すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を
   既定値にすることができます:
   [<assembly: AssemblyVersion("1.0.*")>] *)
[<assembly: AssemblyVersion("1.0.0.0")>]
[<assembly: AssemblyFileVersion("1.0.0.0")>]

(* () でも可 *)
do()

最後の do() がないとコンパイラに怒られますよ。
(追記:「do()」の代わりに、「()」などでも動作します)
これをビルドすると以下のように、アセンブリ情報が付与されます。

簡単ですね。

サテライトアセンブリを作成していて、カルチャを指定する必要がある場合は、

open System.Resources

(* 略 *)

[<assembly: NeutralResourcesLanguageAttribute("")>]

を追加してください。

本当にしたかったこと

当初のもくろみでは、DLLをCOM参照可能にして、Excel VBAから呼び出そうと考えていました。
しかしながら、COM相互参運用設定(C#のプロジェクトの)に該当する部分の設定がうまくいかず、時間切れになってしまいました。
うーん、ちょっと残念。