visual Studio内にフォントの組み込む方法

OSに直接組み込めばフォントはvisual studioが自動で読み込んで暮れて使えるのですが、自分のPC以外でアプリケーションの修正などを行いたい場合、その都度フォントをOSに入れるのは面倒なので、フォントをプロジェクト内に置きそれを参照する方法があります。
※今回はこちらのフォントをお借りしました

キルゴ – 無料で使える日本語フォント投稿サイト|フォントフリー

絶対パス

Dim pfc As New System.Drawing.Text.PrivateFontCollection()
pfc.AddFontFile("C:\Users\Harumi_Sagawa\Downloads\GN-KillGothic_U\GN-KillGothic-U-KanaNB.ttf")
Dim f As New System.Drawing.Font(pfc.Families(0), 22)
Label1.Font = f

絶対パスでの指定方法です。これでもOSにインストールせずに独自のフォントを使うことができるのですが、フォントを毎回指定の場所に置かなければならないため不便です。

相対パス

Dim pfc As New System.Drawing.Text.PrivateFontCollection()
pfc.AddFontFile(System.Environment.CurrentDirectory + "/GN-KillGothic-U-KanaNB.ttf")
Dim f As New System.Drawing.Font(pfc.Families(0), 22)
Label1.Font = f

このように設定できます。visual studioのカレントディレクトリがわからず結構ハマっていたのですがSystem.Environment.CurrentDirectoryこいつを使うことでカレントディレクトリを取得することができるので、カレントディレクトリプラス使いたいフォントとすることで使用することができました。
ちなみに僕はカレントディレクトリがbinファイルのDebugがルートディレクトリになっていたのでDebugフォルダにフォントにtffファイルを直で突っ込んでいます。

追記

Releaseフォルダ内にも同様にフォントを入れたフォルダを作成しておく必要があります。デバッグ時の実行と、ビルド時の実行でパスが異なるようで、入れておかなかった場合にはエラーが出てしまいます。

最終的に今回のプロジェクトではFontSelectというクラスを作成し、.Designer.vbクラスにインスタンスを作成して呼び出しました。

Public Class FontSelect
    Dim NotoSansCJKjpBold As New System.Drawing.Text.PrivateFontCollection()

    Dim MakinasScrap As New System.Drawing.Text.PrivateFontCollection()

    Dim RobotoSlabBold As New System.Drawing.Text.PrivateFontCollection()


    'NotoSansCJKjpBoldフォント
    Public Function NotoFont() As FontFamily

        If NotoSansCJKjpBold.Families.Length = 0 Then
            Dim filePath As String = System.Environment.CurrentDirectory + "/myFont/NotoSansCJKjp/NotoSansCJKjp-Bold.otf"

            If System.IO.File.Exists(filePath) Then
                NotoSansCJKjpBold.AddFontFile(filePath)

            Else
                Return New FontFamily("Noto Sans CJK JP Bold")
            End If
        End If

        Return NotoSansCJKjpBold.Families(0)
    End Function


    'Makinasフォント1
    Public Function Makinas() As FontFamily

        If MakinasScrap.Families.Length = 0 Then
            Dim filePath As String = System.Environment.CurrentDirectory + "/myFont/makinas_scrap/Makinas-Scrap-5.otf"

            If System.IO.File.Exists(filePath) Then
                MakinasScrap.AddFontFile(filePath)

            Else
                Return New FontFamily("マキナス Scrap 5")
            End If
        End If
        Return MakinasScrap.Families(0)
    End Function

    'Robotoフォント
    Public Function Roboto() As FontFamily

        If RobotoSlabBold.Families.Length = 0 Then
            Dim filePath As String = System.Environment.CurrentDirectory + "/myFont/roboto-slab/RobotoSlab-Bold.ttf"

            If System.IO.File.Exists(filePath) Then
                RobotoSlabBold.AddFontFile(filePath)

            Else
                Return New FontFamily("Roboto Slab")
            End If
        End If

        Return RobotoSlabBold.Families(0)
    End Function
End Class

重複している部分を関数にすればもっと綺麗にかけそうですが許してください..

上記のクラスを作成して3つのフォントをプロジェクトに使いました。

If NotoSansCJKjpBold.Families.Length = 0 Then

このif文ですが、入れないとインスタンスをガンガン作成してしまい落ちたので入れました。

またまた追記

.designer.vbの下記の位置にインスタンスを作成しました。自動生成のファイルで書き換えたら危なそうですが書き換えちゃいました。フォームデザイナーからインスタンス作れないんだからしょうがないじゃないか!

'メモ: 以下のプロシージャは Windows フォーム デザイナで必要です。
'Windows フォーム デザイナを使用して変更できます。  
'コード エディタを使って変更しないでください。
<system.diagnostics.debuggerstepthrough()> _
Private Sub InitializeComponent()
###ここらへん####
</system.diagnostics.debuggerstepthrough()>

フォントを設定してるところ

Me.ButtonClose.Font = New System.Drawing.Font(FontSelect.NotoFont(), ...省略)
できた!windowsに入ってるfontアンインストールだ!

あれ? windowsのシステムフォントの中にフォントがインストールされていないとdesigner.vbは見ることができないようです。(できる方法あったら教えてください)
相対パスを読みに行くのはデバッグorビルド時ってのはなんとなく想像つきますね。使うフォントはインストールして入れましょう! まぁでもこれでシステムフォントを参照しなくはなったので目的は達成できました。

最終的にインスタンスを作成する場所を変えてグローバル変数で宣言しました。

Public FontSelect As New FontSelect

参考にさせていただいたサイト

作業フォルダのパスを取得/設定するには?[C#、VB]:.NET TIPS – @IT