Category Archives: Memo

Making a tiny .NET Core 3.0 entirely self-contained single executable – Scott Hanselman

情報源: Making a tiny .NET Core 3.0 entirely self-contained single executable – Scott Hanselman

.NET Core 2.2より、EXEファイルの作成が可能になりましたが、SCD(Self Contained Derivery)を選択してEXEを作成した場合、現状はEXE本体だけではなく必要の有無に限らず大量のライブラリファイル等々が一つフォルダにぶん投げられてしまい、実行時最低でも集住あるファイルを同時に移動させる必要があります。仮にそれがコンソールに「Hello World!」と表示するだけだったとしても。

.NET Core 3.0では、これををできるだけ小さなEXEファイル一つにするようプロジェクトが進められていて、この記事はその作業の進捗確認のような感じになっています。現状のPreview 6はdotonet publishコマンド実行時に、アセンブリの依存関係を厳密に調べて、必要なライブラリだけをデプロイフォルダに移動し調整を行う事が実現され、将来のアップデートは、EXE本体を含め、ランタイム、各ライブラリも事前にILが最適化された状態で実行バイナリ化され、1つのEXEにまとめるようになるようです。最新の開発状況では、コンソールに「Hello World!」を表示するアプリケーションで二十数MBの大きさのEXEとなるようです。

早くリリースして欲しいですね!

XAML Islands v1

At Microsoft Build, we announced that the Windows 10 May 2019 Update (version 1903) would include XAML Islands v1. Below you can find more details on the roadmap and two workstreams in progress to complete the developer experience: the .NET wrappers and Visual Studio 2019 support. What are XAML Islands? XAML Islands enable .NET and […]

情報源: XAML Islands v1 – Updates and Roadmap – Windows Developer Blog

Memo

Try the new System.Text.Json APIs!

情報源: Try the new System.Text.Json APIs

いままで、.NETのJSONはサードパーティーのJson.NET頼りでしたが、System.Text.Jsonとして標準ライブラリにJsonのライブラリが入ってくるようです。ライブラリは。NET Core 3.0 Previewに含まれるほか、Nugetを使用することで.NET Framework 4.6異常でも使用が可能です。詳細は情報源を確認してください。

Visual Studio 2019 version 16.2 Preview 2

Download Visual Studio 2019 16.2 Preview 2 today with support for Microsoft Edge Insider, .NET productivity fixes and installer improvements

情報源: Visual Studio 2019 version 16.2 Preview 2 | The Visual Studio Blog

  • Microsoft Edge Insiderのサポート
  • Visual Studio Installerの改善
  • .NETの生産性の向上
    • usingのソート、不要なusingの削除を編集メニューに追加
    • switch分をswitch式に変更する機能の追加
  • コマンドラインでのインストーラーの改善

詳細は情報源へ。

Attack Surface Analyzer 2.0 

情報源: Announcing Attack Surface Analyzer 2.0 – Microsoft Tech Community – 487961

Memo.

ソフトウェアシステムの脆弱性調査に使用するツールのアップデート。SDLのプラクティスの中では使用することが推奨されている、

PRP: Parallel Redundancy Protocol

メモ。

Parallel Redundancy Protocol – Wikipedia

PRP – The Wireshark Wiki

https://web.archive.org/web/20150924073019/https://www.zhaw.ch/storage/engineering/institute-zentren/ines/forschung-und-entwicklung/time-synchronisation/tutorial-on-prp.pdf

PRPはイーサネット冗長化のネットワークプロトコル。PRPはHSRと共にIEC 62439-3:2016により標準化されている。また、IEC 61850の枠組みで変電所の自動化に採用されている。

PRPは高可用性と従来のRSTPの切り替え時間では必要十分ではない短い切り替え時間を必要とするアプリケーションに適している。

PRPは専用のハードウェア(FPGAなどで作られる)が必要となるHSPと違い、すべてソフトウェアで実現される。実際には、カーネルモードもしくはユーザーモードで動作するネットワークドライバーとして動作し、アプリケーションからは単一のネットワークインターフェースに見える(WindowsではNDISドライバーとして実装されることが多い)。プリンタなどの単一接続点しか持たない機器については、二重接続ノードのように動作するRedBoxを使用して接続することができる。

また、古いIEC 62439:2010規格は、一部の制御システムではまだ使用されているためPRP-0と呼ばれ、PRP 2012は “PRP”と呼ばれている。

Create Interactive .NET Documentation with Try .NET

Try .NET is an interactive documentation generator for .NET Core. Use the Try .NET global tool to create interactive markdown experiences.

情報源: Create Interactive .NET Documentation with Try .NET | .NET Blog

Memo.

Exploring new frontiers for Git push performance 

In previous posts I’ve talked about performance improvements that our team contributed to the Git community. At Microsoft, we’ve been pushing Git to its limits with the largest and busiest Git repositories on the planet, improving core Git as we go and sending these improvements back upstream.

情報源: Exploring new frontiers for Git push performance | Azure DevOps Blog

Memo.

C# 8のinterfaceのデフォルト実装

Default implementations in interfaces With last week’s posts Announcing .NET Core 3.0 Preview 5 and Visual Studio 2019 version 16.1 Preview 3, the last major feature of C# 8.0 is now available in preview. A big impediment to software evolution has been the fact that you couldn’t add new members to a public interface.

情報源: Default implementations in interfaces | .NET Blog

C# 8から導入されるinterfaceのデフォルト実装についての記事。

以下はテキトー訳

インタフェースに、そのメンバーの実装を記述できるようになります。実装したクラスもしくは構造体がそのメンバの実装を提供しなくてもエラーにはならず、interfaceで記述されたそのメンバのコードが実行されます。公開済みライブラリのインタフェースにメンバを追加する必要が出てきたときに、既存のそのインタフェースを実装した型に影響を与えることなく、追加することができます。

次のようなインタフェースがあるとします。

interface ILogger
{
    void Log(LogLevel level, string message);
}

既存のクラスは、恐らく所有者が異なる別のコードベースにあり、次のようにILoggerを実装しています。

class ConsoleLogger : ILogger
{
    public void Log(LogLevel level, string message) { ... }
}

次のようにILoggerインタフェースにLogメソッドのオーバーロードを追加したいと思います。デフォルトの実装、つまりメソッド本体を提供することで、既存の実装を壊すことなく実行できます。

interface ILogger
{
    void Log(LogLevel level, string message);
    void Log(Exception ex) => Log(LogLevel.Error, ex.ToString());
}

これは、ConsoleLoggerが必要とするインタフェース規約を満たしています。そのインスタンスが、インタフェースに変換されて、新しいLogのオーバーロードが呼ばれた場合には、インタフェースで記述したデフォルト実装が呼び出されます。

public static void LogException(ConsoleLogger logger, Exception ex)
{
    ILogger ilogger = logger; // Converting to interface
    ilogger.Log(ex);          // Calling new Log overload
}

もちろん、新しいメンバーについて知っている実装クラスは、デフォルト実装が存在するインタフェースメンバーに対しても、独自の方法でそれを実装する事ができます。

以下にチュートリアルが用意されています。

Safely update interfaces using default interface members in C# | Microsoft Docs