rksoftware

Visual Studio とか C# とかが好きです

城東.NET #32 勉強会を開催しました。

■ 城東.NET

城東.NET #32 を開催しました。

城東.NET は東京の最近は秋葉原で毎月第3水曜日に開催している .NET 系の勉強会です。
発表を中心として、発表でなくとも最近やった事や新しい情報などを参加者で共有している会です。 f:id:rksoftware:20190515233545j:plain

今月の発表は、.editorconfig、blazor、Warning増加チェック の発表となりました。

私は 新しい EditorConfig (IntelliCode) というタイトルで話をしました。

Visual Studio 2019 で注目度のあまり高くない機能についての内容です。

■ 次回予定

来月は 06月19日(水)に開催の予定です。

.NET に関心のある方、是非遊びに来てください。

.pdb ファイルを生み出さない

.NET ではビルドするとバイナリに拡張子 .pdb なファイルが生まれます。

例、コンソールアプリ


.pdb なファイルが生まれている

■ .pdb ファイルを生まない

Visual Studio でプロジェクトのプロパティで設定を変更します。
プロジェクトのプロパティ ビルド > 詳細 ボタン で開く ビルドの詳細設定出力 > デバッグ情報なし にします。
f:id:rksoftware:20190512110803j:plain

例、コンソールアプリ 再び

設定を変更してビルドをすると期待通りに .pdb は生まれなくなりました。

フローティングアクションボタンを表示する

Activity クラスがベースクラスとなるテンプレートで作成したプロジェクトの Activity を、AppCompatActivity クラスをベースクラスに変更してきました。

今回が最後です。
フローティングアクションボタンを表示すれば、AppCompatActivity のテンプレートのおおよその要素を取り込めたのではないかと思います。

■ 完成イメージ

右下にフローティングアクションボタンが表示されています。

今回は Xamarin.Android でフローティングアクションボタン付きで作られるテンプレートに倣ってメールのアイコンを表示してみました。

■ NuGet パッケージのインストール

フローティングアクションボタンが定義されているアセンブリです。

クラス 名前空間付 アセンブリ
FloatingActionButton Android.Support.Design.Widget.FloatingActionButton Xamarin.Android.Support.Design

Xamarin.Android.Support.Design アセンブリを NuGet から取得します。

■ レイアウトを変更

レイアウト定義に android.support.design.widget.FloatingActionButton 要素を追加します。
また、フローティングアクションボタンを下寄せ配置するために、レイアウト要素を LinearLayout から FrameLayout に変更しました。

変更前

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button android:id="@+id/myButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />
</LinearLayout>

変更後

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button android:id="@+id/myButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />
    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        app:srcCompat="@android:drawable/ic_dialog_email" />
</FrameLayout>

■ Activity のコードを変更

あとは Activity で普通に FindViewById で取得して使います。

var fab = FindViewById<Android.Support.Design.Widget.FloatingActionButton>(Resource.Id.fab);
fab.Click += (sender, e) => Toast.MakeText(this, "アクション", ToastLength.Long).Show();

変更前

[Activity(Label = "Activity", MainLauncher = true, Icon = "@mipmap/icon", Theme = "@style/AppTheme")]
public class MainActivity : Android.Support.V7.App.AppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.Main);
    }
}

変更後

[Activity(Label = "Activity", MainLauncher = true, Icon = "@mipmap/icon", Theme = "@style/AppTheme")]
public class MainActivity : Android.Support.V7.App.AppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.Main);

        var fab = FindViewById<Android.Support.Design.Widget.FloatingActionButton>(Resource.Id.fab);
        fab.Click += (sender, e) => Toast.MakeText(this, "アクション", ToastLength.Long).Show();
    }
}

これでフローティングアクションボタンを表示し

タップでトースト表示されるようになりました。

AppCompatActivity でメニューを表示する

Xamarin.Android で AppCompatActivity をベースクラスにした Activity でメニューを表示します。
※C# で書かれているだけで内容そのものは通常の Android アプリ開発と同じだと思います。

■ 完成図

右上の端に縦に並んだ三つの点があります。こことタップすると

メニューが表示されます。

Android アプリで昔よく見た UI ですね。最近は見かけなくなった気がしますけれども。

■ 作業前

作業前の Activity のソースは次のようになってるとします。

[Activity(Label = "Activity", MainLauncher = true, Icon = "@mipmap/icon", Theme = "@style/AppTheme")]
public class MainActivity : Android.Support.V7.App.AppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.Main);
    }
}

■ 表示されるメニューのレイアウトを定義

今回は Xamarin.Android でメニュー付きで作られるテンプレートに倣って Resource フォルダの中に menu フォルダを作り、その中に menu_main.xml というファイルを作成しました。

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
  <item
      android:id="@+id/action_settings01"
      android:title="メニューアイテム01"/>
  <item
      android:id="@+id/action_settings02"
      android:title="メニューアイテム02"/>
</menu>

■ Activity で OnCreateOptionsMenu メソッドを実装

Activity クラスでオーバーライド可能な状態で定義されている OnCreateOptionsMenu(Android.Views.IMenu) メソッドを実装します。

    public override bool OnCreateOptionsMenu(Android.Views.IMenu menu)
    {
        MenuInflater.Inflate(Resource.Menu.menu_main, menu);
        return true;
    }

実装後のコード

[Activity(Label = "Activity", MainLauncher = true, Icon = "@mipmap/icon", Theme = "@style/AppTheme")]
public class MainActivity : Android.Support.V7.App.AppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.Main);
    }

    public override bool OnCreateOptionsMenu(Android.Views.IMenu menu)
    {
        MenuInflater.Inflate(Resource.Menu.menu_main, menu);
        return true;
    }
}

これで縦の三つの点が出ました。

レイアウトを設定しない場合

ここで、return true; が気になったので試しに MenuInflater.Inflate(Resource.Menu.menu_main, menu); をコメントにしてみました。

    public override bool OnCreateOptionsMenu(Android.Views.IMenu menu)
    {
        //MenuInflater.Inflate(Resource.Menu.menu_main, menu);
        return true;
    }

縦の三つの点は出なくなりました。

レイアウトの設定はサボれませんでした。

■ メニュー選択時の処理を追加する

メニュー表示時の処理と同様にオーバーライド可能な状態で定義されている OnOptionsItemSelected(Android.Views.IMenuItem) メソッドを実装します。

    public override bool OnOptionsItemSelected(Android.Views.IMenuItem item)
    {
        var id = item.ItemId;
        if (id == Resource.Id.action_settings01)
        {
            var toast = Toast.MakeText(this, "一つ目のオプション", ToastLength.Long); toast.SetGravity(Android.Views.GravityFlags.Top, 0, 0); toast.Show();
            return true;
            }
        if (id == Resource.Id.action_settings02)
        {
            var toast = Toast.MakeText(this, "二つ目のオプション", ToastLength.Long); toast.SetGravity(Android.Views.GravityFlags.Top, 0, 0); toast.Show();
            return true;
        }

        return base.OnOptionsItemSelected(item);
    }

実装後のコード

[Activity(Label = "Activity", MainLauncher = true, Icon = "@mipmap/icon", Theme = "@style/AppTheme")]
public class MainActivity : Android.Support.V7.App.AppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.Main);
    }

    public override bool OnCreateOptionsMenu(Android.Views.IMenu menu)
    {
        MenuInflater.Inflate(Resource.Menu.menu_main, menu);
        return true;
    }

    public override bool OnOptionsItemSelected(Android.Views.IMenuItem item)
    {
        var id = item.ItemId;
        if (id == Resource.Id.action_settings01)
        {
            var toast = Toast.MakeText(this, "一つ目のオプション", ToastLength.Long); toast.SetGravity(Android.Views.GravityFlags.Top, 0, 0); toast.Show();
            return true;
            }
        if (id == Resource.Id.action_settings02)
        {
            var toast = Toast.MakeText(this, "二つ目のオプション", ToastLength.Long); toast.SetGravity(Android.Views.GravityFlags.Top, 0, 0); toast.Show();
            return true;
        }

        return base.OnOptionsItemSelected(item);
    }
}

これで、メニュー選択後に

選択結果がトースト表示されるようになりました。

秋葉原 C# もくもく会 #83 勉強会を開催しました

■ C# もくもく会

C# もくもく会 #83 を開催しました。

C# もくもく会 は東京の秋葉原で毎週木曜日に開催している .NET 系の勉強会です。
もくもく自習を基本とし、分からないことを教えあったり情報共有したりしている会です。 定期開催していますので、お時間のある時に遊びに来ていただければと思います。
ちょっと詰まった時、ネット上で聞くのははずかしいなぁ、という課題のできた時などにも思い出していただけると嬉しいです。
f:id:rksoftware:20190510235742j:plain

■ 今週の成果発表

今週は、というか最近 Blazor 大流行ですね

  • Blazor はじめています
  • 入門書で C# マスター
  • ブログ書きました
  • 成果のアウトプットをしようとしてます(文章でまとめるの難しいです)

ちなみにこの勉強会ですが、実は公序良俗に反しなければどのような技術を扱っても大丈夫です。そもそも C# エンジニアが C# だけしか使わないというわけではありませんし。

■初心者歓迎

このもくもく会には、入門者の方も多くご参加いただいています。 突然 C# やらなければならなくなって途方に暮れている方、何となく C# をやってきたけど改めて見直してみたい方なども大歓迎です。
入門セミナー代わりでのご参加も歓迎です。プログラミング入門者の方も是非遊びに来てください。

特に C# で課題をお持ちでなくても是非遊びに来てください。

■ 目指す勉強会スタイル

世界一敷居の低い勉強会を目指しています。

何か聞きたいことがある場合は、聞く相手を決めずに独り言のようにつぶやくと誰かが拾ってくれる

何か共有したい情報を見つけた場合も、聞く相手を決めずに独り言のようにつぶやくと誰かが拾ってくれる

そんなスタイルでやっています。

■ 次回予定

次回は 2019/05/16 に開催予定です。

C# に関心のある方、是非遊びに来てください。

複数プロジェクトを同時にデバッグする for mac

以前に Visual Studio で複数プロジェクトを同時にデバッグする記事を書いていました。

Visual Studio では Visual Studio のひとつのインスタンス毎にソリューションを扱いますが、Visual Studio for Mac でも同様です。ひとつのソリューションの中に複数の実行可能プロジェクトを作ることができるのも同様です。そして、それを複数同時に実行できることも同様です。

■ マルチスタートアッププロジェクト

ソリューションエクスプローラーで ソリューションを右クリック > オプション

ソリューションオプション ウィンドウで 実行 > 構成 > 新規ボタン で開く 新しい構成 ウィンドウに好きな名前を入力します。
今回は、複数プロジェクト を名付けました。
f:id:rksoftware:20190506191441j:plain

構成 の中の 複数プロジェクト を選択します。
f:id:rksoftware:20190506191505j:plain

実行構成 の ソリューション項目 で実行するプロジェクトのチェックを ON。OKボタン をクリックします。
f:id:rksoftware:20190506191528j:plain

複数プロジェクト を選択して 実行。
f:id:rksoftware:20190506191550j:plain

これで、プロジェクトを複数同時に実行できるようになりました。

.NET Core 3.0 の Publishing Single EXEs 実行時の Temp を確認する

先日 .NET Core のプレビュー版の、Publish の結果を一つのファイルとして作成するオプションを試しました。 期待通りにファイル一つだけが生成されました。

■ 実行時に Temp に展開される

.exe ファイルは一つだけ作成されますが、実行時にはランタイムは展開されるそうです。
というわけで、実行して Temp の状況を確認してみると

C:\Users\ユーザー名\AppData\Local\Temp\.net\アプリ名\謎の文字列\

というフォルダに 273 個のファイルが生まれていました。

これを、 /p:PublishSingleFile=false オプションで作成される 274 個のファイルと比較してみます。

■ 比較結果

差異のあるのは

  • アプリ名.dll
  • アプリ名.exe

の 2 ファイルだけ、272 個のライブラリ群は差異なしとでました。
※ .exe ファイルは Temp に生まれない

安心の結果ですが、何気に .exe と Temp で実質 2 倍のインストールの要求空き容量ですね。