F#でなんかアプリを作ろうと思ったら、再配布ランタイムライブラリが多すぎるよ

---
# 結論

タイトルの通り、F#でなんかアプリケーションを書こうかな、と思いました。
とりあえずHelloWorldを書いてみたら、Releaseディレクトリ下に大量のdllがコピーされたので、びっくりした。
というか、これだけのdllを再配布しないといけないのはダメだよー。
Roslynもそうだけど、Microsoftのプロジェクトなんだから、.NETFrameworkのランタイムに全部含めてほしいな、という内容。

---
# はじまり(サンプルコードを書いてみた)

という事で、VisualStudio2019で新規プロジェクトを作って、対象フレームワークは、.NETFramework4.6.1ぐらいにして、、、

```F#:Program.fs
[<EntryPoint>]
let main argv =
    let message = from "F#" // Call the function
    printfn "Hello world %s" message
    System.Console.WriteLine("aaaaaaa");
    0 // return an integer exit code
```

テンプレートのままです。
F#のクラスの呼び出しは、「.(ドット)」なんですねー。

ということで、リビルドしてみる。

---
# そして、ディレクトリを見てびっくりした

```cmd
C:\FsTestConsole\FsTestConsole\bin\Release>dir /s /b /a-d
C:\FsTestConsole\FsTestConsole\bin\Release\net461\FSharp.Core.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\FsTestConsole.exe
C:\FsTestConsole\FsTestConsole\bin\Release\net461\FsTestConsole.exe.config
C:\FsTestConsole\FsTestConsole\bin\Release\net461\FsTestConsole.pdb
C:\FsTestConsole\FsTestConsole\bin\Release\net461\Microsoft.Win32.Primitives.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\netstandard.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.AppContext.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Collections.Concurrent.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Collections.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Collections.NonGeneric.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Collections.Specialized.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.ComponentModel.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.ComponentModel.EventBasedAsync.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.ComponentModel.Primitives.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.ComponentModel.TypeConverter.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Console.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Data.Common.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Diagnostics.Contracts.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Diagnostics.Debug.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Diagnostics.FileVersionInfo.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Diagnostics.Process.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Diagnostics.StackTrace.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Diagnostics.TextWriterTraceListener.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Diagnostics.Tools.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Diagnostics.TraceSource.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Diagnostics.Tracing.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Drawing.Primitives.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Dynamic.Runtime.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Globalization.Calendars.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Globalization.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Globalization.Extensions.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.IO.Compression.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.IO.Compression.ZipFile.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.IO.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.IO.FileSystem.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.IO.FileSystem.DriveInfo.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.IO.FileSystem.Primitives.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.IO.FileSystem.Watcher.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.IO.IsolatedStorage.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.IO.MemoryMappedFiles.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.IO.Pipes.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.IO.UnmanagedMemoryStream.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Linq.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Linq.Expressions.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Linq.Parallel.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Linq.Queryable.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Net.Http.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Net.NameResolution.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Net.NetworkInformation.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Net.Ping.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Net.Primitives.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Net.Requests.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Net.Security.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Net.Sockets.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Net.WebHeaderCollection.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Net.WebSockets.Client.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Net.WebSockets.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.ObjectModel.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Reflection.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Reflection.Extensions.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Reflection.Primitives.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Resources.Reader.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Resources.ResourceManager.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Resources.Writer.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Runtime.CompilerServices.VisualC.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Runtime.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Runtime.Extensions.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Runtime.Handles.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Runtime.InteropServices.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Runtime.InteropServices.RuntimeInformation.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Runtime.Numerics.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Runtime.Serialization.Formatters.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Runtime.Serialization.Json.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Runtime.Serialization.Primitives.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Runtime.Serialization.Xml.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Security.Claims.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Security.Cryptography.Algorithms.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Security.Cryptography.Csp.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Security.Cryptography.Encoding.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Security.Cryptography.Primitives.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Security.Cryptography.X509Certificates.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Security.Principal.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Security.SecureString.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Text.Encoding.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Text.Encoding.Extensions.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Text.RegularExpressions.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Threading.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Threading.Overlapped.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Threading.Tasks.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Threading.Tasks.Parallel.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Threading.Thread.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Threading.ThreadPool.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Threading.Timer.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.ValueTuple.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Xml.ReaderWriter.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Xml.XDocument.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Xml.XmlDocument.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Xml.XmlSerializer.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Xml.XPath.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\System.Xml.XPath.XDocument.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\cs\FSharp.Core.resources.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\de\FSharp.Core.resources.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\es\FSharp.Core.resources.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\fr\FSharp.Core.resources.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\it\FSharp.Core.resources.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\ja\FSharp.Core.resources.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\ko\FSharp.Core.resources.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\pl\FSharp.Core.resources.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\pt-BR\FSharp.Core.resources.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\ru\FSharp.Core.resources.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\tr\FSharp.Core.resources.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\zh-Hans\FSharp.Core.resources.dll
C:\FsTestConsole\FsTestConsole\bin\Release\net461\zh-Hant\FSharp.Core.resources.dll
```

![fsconsole.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/7d931020-1e62-906f-d06e-5d1c6256ce5c.png)

Releaseディレクトリ以下にファイルが113個で6MB。....HelloWorldだけなのに...

```cmd
C:\FsTestConsole\FsTestConsole\bin\Release>dir net461\FsTestConsole.exe
 ドライブ C のボリューム ラベルは Windows です
 ボリューム シリアル番号は CA06-E844 です

 C:\FsTestConsole\FsTestConsole\bin\Release\net461 のディレクトリ

2023/09/26  16:48             8,192 FsTestConsole.exe
               1 個のファイル               8,192 バイト
```

自分が書いたHelloWorldの &quot;FsTestConsole.exe&quot; はたった8kB

たった 8kBのために、6MBのランタイムのDLL....orz

これ、全部一緒に配布しなきゃいけないんですかね!?
実行環境のOSに入っている.NETFramework4系のランタイムでは代替できないんですかね!?

(Releaseディレクトリ下に .pdb ファイルが作成されるのにも、少し違和感...)

---
# 以上