実現したいこと
言語:C#
環境:visualstudio
Windowsフォームで作成したアプリでインストール先に存在しないフォントを表示させたい。
前提
アプリ内のテキストボックスやラベルのフォントを標準フォント以外のフォントに設定していましたが
アプリ完成後、インストーラーを作り別PCにインストールしてみたところ、インストール先のPCには標準のフォントしかないため
アプリ内のフォントがすべて標準のものにさし変わっていました。
こちらを解決する方法をご教示いただきたいです。
こちらは以前質問していましたが、実装できずに、断念していました。
しかし、やはり実装したいと思い、再度質問させていただいています。
以前回答でいただいた、下記URLを参考にして、いろいろ試しましたが
以下のことが起こっています。
▼参考サイト
https://dobon.net/vb/dotnet/graphics/privatefontcollection.html
試したこと
参考サイトをもとに以下を実施
1.アンセーフコードの許可にチェックを入れる
2.リソースにフォントを追加
※追加方法はこちらを参照
https://dobon.net/vb/dotnet/programing/vsresource.html
3.参考サイトの下記コードを追加
起こったこと
表示自体は成功しているが、立ち上げてすぐに以下の例外が発生して、強制終了してしまう。
発生している問題・エラーメッセージ
エラーメッセージ System.AccessViolationException HResult=0x80004003 Message=保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。 Source=<例外のソースを評価できません> スタック トレース: <例外のスタック トレースを評価できません>
該当のソースコード
//PrivateFontCollectionオブジェクトを作成する System.Drawing.Text.PrivateFontCollection pfc = new System.Drawing.Text.PrivateFontCollection(); //リソース(wlmaru2004p4u)をバイト配列に読み込む byte[] fontBuf = Properties.Resources.CP_Font; //バイト配列のポインターを取得する //アンセーフコードが許可されている必要がある unsafe { fixed (byte* pFontBuf = fontBuf) { //PrivateFontCollectionにフォントを追加する pfc.AddMemoryFont((IntPtr)pFontBuf, fontBuf.Length); } } foreach (Label label in this.Controls.OfType<Label>()) { label.UseCompatibleTextRendering = true; label.Font = new Font(pfc.Families[0], label.Font.Size); }
pfc.Dispose();
補足情報(FW/ツールのバージョンなど)
デバッグモードで処理を見る限り、表示を行う処理段階ではエラーは発生しておらず、
以下の場所で例外が発生していました。
static class Program { /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1());//ここで例外が発生している。 } }
フォントは2種類、ttfとotfそれぞれで試しました。
・チェックポイントフォント
・ふぉんとうは怖い明朝体
また、参考サイト内のリソース埋め込みの方法以外にもフォントファイルを読み込む方法でも同じ個所で同じエラーが発生します。
リソース埋め込みの方法では、参考サイト記載の2パターンとも試しています。(※または、次のようにして~の箇所)
該当のソースコードを削除すれば、例外は発生しないので、該当のソースコードに原因があるとは思います。
どなたかご教授お願いいたします。

回答2件
あなたの回答
tips
プレビュー