.netframework 起動が異常に遅い。

.netframework4 client profile で昔に作成したソフトの改修依頼が入った。
修正後、起動テストすると、起動までに30ほどかかる。
初回だけではなく、二度目でも三度目でも同じ。
???
改修前のソフトの起動は1秒以内。
なぜ・・・・。

VisualStudioが新しくなっているせいかと考え、古いVisualStudioでビルドし直してみるが変わらない。
OSがWindows7とはいえ、改修前はすぐに起動しているのに・・・。

何かが記憶を通り過ぎた。
これは前にもあった。

そうだ。
ディジタル署名が検証できないのだ。
ビルド後にディジタル署名していたが、こいつを検証するサーバは別セグメントにあり、アクセスできない。
Windows7が残っているこのLANは閉鎖環境なのだ。
ディジタル署名は、署名されていれば当然検証が必要となり、サーバにアクセスできないためタイムアウトを待つということか。

以前にも同じようなことがあって、調べた気がする。
ディジタル署名を外したら治りました。

閉鎖環境でディジタル署名するなかれ。

NTPサーバに同期できない chrony Windows11 plala

Windows11をインストール後、NTPサーバを設定して同期しようとすると、
「ピアに到達できません」
とのエラー。???昨日ルータをいじったせいかも?

色々試すと、Linuxサーバのchronyがダメらしい。RTX810には同期できます。

どうも上位のNTPサーバとchronyが同期できないと、クライアントPCも同期できないようなので、
上位のplalaのNTPサーバに直接同期してみると、、、、やはり失敗しました。

上位をplalaをやめてnict とsakura にして、chronyを再起動すると・・・治りました!

・・・・「ぷららのNTPサーバーは、2022年3月31日をもって終了しました。」
知りませんでした。

行をファイル "obj\Release\.NETFramework,Version=v4.8.AssemblyAttributes.vb" に書き込めませんでした。

VisualStudioでビルド時に警告が表示されました。
「行をファイル "obj\Release\.NETFramework,Version=v4.8.AssemblyAttributes.vb" に書き込めませんでした。」

NuGetパッケージで、脆弱性の出ていいるやつをアップデートしたら出ました。

obj/~ /AssemblyAttributes.vb にアクセスできないとのことでしたので、
obj 以下のフォルダ、ファイルをすべて削除してから、ビルドすると消えました。

ILMergeで失敗する ~2

またILMergeがうまくいきません。
だいたい、プロジェクトが締め切り間近になって、ほぼ開発が終了したころに、
やってくるこの時間です。

プロジェクトをリビルドすると、依存関係がうまくいっていないのか、ビルドに失敗します。
カスタムコントロールのプロジェクトが先にビルドされれば大丈夫と思い、依存関係をいじったら
ビルドできなくなりました。

色々と恐る恐る、いじってみると、
アセンブリに署名」が問題をおこしているようでした。

カスタムコントロール等の「アセンブリに署名する」のチェックをすべて外し、ビルドしなおすと段々参照が治っていきました。
最悪の状態ではSystem の参照さへみつからなくなっていたのでしたが・・・。

色々な参照を削除して、もう一度追加したりしているうちに、なんとかビルドできるようになりました。

さて、次は「アセンブリに署名」できるようにします。
これは経験があるのですが、私の環境ではオレオレ証明書を使用しているせいか、Fodyで単一実行ファイルを作ると、この現象が起きます。


Nugetパッケージマネージャーを確認すると、やはりFodyがインストールされてました。
Custra.Fody、Fodyの順にアンインストール(怒られたので)。
すると、「アセンブリに署名」でビルドできるようになりました。

最後に、いつものILMergeです。
前回、手動でマージするとエラーが表示されることにようやく気付いたので、それで行きました。
まずはやはりプロジェクトに変な文字を使用しているせいか、パスがおかしくなっていました。
それだけでは解決しません。

An exception occurred during merging:
Unresolved assembly reference not allowed: System.Diagnostics.Tracing.
場所 System.Compiler.Ir2md.GetAssemblyRefIndex(AssemblyNode assembly)
場所 System.Compiler.Ir2md.GetTypeRefIndex(TypeNode type)
場所 System.Compiler.Ir2md.VisitReferencedType(TypeNode type)
場所 System.Compiler.Ir2md.GetMemberRefIndex(Member m)
場所 System.Compiler.Ir2md.GetMethodToken(Method m)
場所 System.Compiler.Ir2md.VisitMethodCall(MethodCall c ・・・・・ 」
と表示されます。Unresolved assembly reference not allowed かー。

参照が解決できないとなっていたので、バージョンを変えて試してみます。
開発している.NetFrameworkは、4.8 ですが、ILMergeで指定しているのは、4.6.2だったので、そこを4.8に・・・してもダメでしたが、
4.7.2にすると大丈夫でした。でも・・・今試したら4.8でも通りました。。。。よくわからないが、何とかなりましたね・・・。

もう少しきちんと勉強しようと思います。
※ 今以前の記事を見たら、今回とほぼ同じことが書いてある!!!うー。。。

ILMerge で失敗する Duplicate type

さて、またもMergeできません。
もうわからないので、以前のPCで(比較的ILMergeがうまくいっていた)
Releaseフォルダをそのままコピーして、手動でILMerge(VisualStudioのプロンプトを使用)したところ、
エラーメッセージが出ました。


An exception occurred during merging:
ILMerge.Merge: ERROR!!: Duplicate type 'System.Runtime.CompilerServices.AsyncMethodBuilderAttribute' found in assembly 'System.Threading.Tasks.Extensions'. Do you want to use the /alllowDup option?
場所 ILMerging.ILMerge.MergeInAssembly(AssemblyNode a, Boolean makeNonPublic, Boolean targetAssemblyIsComVisible)
場所 ILMerging.ILMerge.Merge()
場所 ILMerging.ILMerge.Main(String[] args)



ということで、AllowDupオプションを付けてマージします

C:\Windows\System32>"C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe" /allowDup /internalize /ndebug /targetplatform:"v4,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.2" /wildcards /out:"C:\Relase\Merge\test.exe" "C:\Relase\test.exe" "C:\Relase\*.dll"

やっとマージできました!

Visual Studio2022 において、ILMergeが失敗する Dll マージできない。

なぜILMergeにこだわっているかというと、
① Costura.Fodyでマージしようとしたときに、自己証明書を使ってアセンブリに署名すると、マージに失敗する。よってアセンブルに署名できない。
ディジタル署名しようとすると、発行で手間がかかる。
③ マージしないとdllをたくさん置かなければならなくて不愉快。

この3つの理由で、ILMergeを使いたいのだが、なぜかビルド後イベントで失敗します。。。
if $(ConfigurationName) == Release (
del /S /Q "$(TargetDir)Merge\*.*"
"C:\Test\Emocheck_Mail\packages\ILMerge.3.0.41\tools\net452\ILMerge.exe" /internalize /ndebug /targetplatform:"v4,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.2" /wildcards /out:"$(TargetDir)\Merge\$(TargetFileName)" "$(TargetDir)\$(TargetFileName)" "$(TargetDir)\"*.dll"
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x86\signtool.exe" sign -fd sha256 -f "C:\Test\codesign\*****.pfx" /p ***** -tr http://timestamp.digicert.com -td sha256 -v "$(TargetDir)\Merge\$(TargetFileName)"
)

ビルド後イベントに記述されていたのは、↑これでしたが。。。

①ILMrege.exeが本当にそこにあるのかチェック。
②out: の出力ディレクトリの文字列がおかしくなっていないかチェック。
コマンドプロンプトでILMerge.exeを実行してみる。


特に③が有効で、失敗するとエラーが表示されるので助かります。

原因は
   
 ①ILMerge.exeの場所が間違っていた。 → ILMerge.exeの位置を確認しました。
 ②それに加えて、出力ディレクトリ、入力のパスもおかしくなっていた。→ パスを直接記述することで解消しました。
  \$(TargetFileName)のあたりで"\"が"\\"になってしまっていることがありました。???
 ③改行を入れるとうまくいかない。 → コマンドプロンプトでのILMerge.exeの実行はためになります。
 ④.netのバージョン指定に問題があり、コマンドプロンプトでILMerge.exeを実行したところ、エラーが表示されました。
   .NETFramework\v4.6.2 → .NETFramework\v4.8

これで解消しました。

Windows11 24H2 において、 パスワードを設定してない共有フォルダにアクセスできない。

パスワードを設定していないと、アクセスできない仕様に変更されたようです。

どうしてもの人は、 Windows11 Pro ならば
gpedit.msc
「コンピュータの構成」→「管理用テンプレート」→「ネットワーク」→「Lanman ワークステーション

にある、「安全ではないゲストログオンを有効にする」 を有効にするとアクセスできます。


まあ、パスワードを設定しておけ、という話だとは思いました。