結論
タイトルの通り、F#でなんかアプリケーションを書こうかな、と思いました。
とりあえずHelloWorldを書いてみたら、Releaseディレクトリ下に大量のdllがコピーされたので、びっくりした。
というか、これだけのdllを再配布しないといけないのはダメだよー。
Roslynもそうだけど、Microsoftのプロジェクトなんだから、.NETFrameworkのランタイムに全部含めてほしいな、という内容。
はじまり(サンプルコードを書いてみた)
という事で、VisualStudio2019で新規プロジェクトを作って、対象フレームワークは、.NETFramework4.6.1ぐらいにして、、、
[<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#のクラスの呼び出しは、「.(ドット)」なんですねー。
ということで、リビルドしてみる。
そして、ディレクトリを見てびっくりした
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
Releaseディレクトリ以下にファイルが113個で6MB。....HelloWorldだけなのに...
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の "FsTestConsole.exe" はたった8kB
たった 8kBのために、6MBのランタイムのDLL....orz
これ、全部一緒に配布しなきゃいけないんですかね!?
実行環境のOSに入っている.NETFramework4系のランタイムでは代替できないんですかね!?
(Releaseディレクトリ下に .pdb ファイルが作成されるのにも、少し違和感...)