2018年11月9日金曜日

C#(.NET Framework)で作ったコンソールアプリを .NET Core を使ってLinuxで動かしてみる!【後編】


こんにちは。よっしーです。

今回は、Visual Studio 2017 の C#(.NET Framework)で作ったコンソールアプリを
.NET Core を使ってLinux上で動かす。という前回からの続きです。

まず、Linux(Ubuntu)へ .NET Core をインストールします。
(現在最新バージョンの .NET Core 2.1 を入れます)

公式サイト(https://dotnet.github.io/)にディストリビューションごとの
インストール手順が記載されていますので参考にして下さい。

私の手元には Ubuntu14.04 があったので、今回はそこへインストールしました。

Microsoftのキーとフィードを登録

$ wget -q https://packages.microsoft.com/config/ubuntu/14.04/packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb

.NET Core をインストール
※ 公式サイトの手順は、sdkをインストールしていますが、
今回は実行環境のみインストールしたいので、runtimeをインストールしています。

$ sudo apt-get install apt-transport-https
$ sudo apt-get update
$ sudo apt-get install dotnet-runtime-2.1

これで実行環境が用意できました。

あとは、前回 Visual Studio で作成した、
実行ファイル一式を、Linux上へ配置します。

$ tree
.
|-- dotnet_sample.deps.json
|-- dotnet_sample.dll
|-- dotnet_sample.pdb
`-- dotnet_sample.runtimeconfig.json

これで準備完了です。さっそく実行してみましょう。
dotnet コマンドにDLLファイルをパラメータとして渡して実行します。

$ dotnet dotnet_sample.dll コマンドライン引数A コマンドライン引数B
コマンドライン引数A, コマンドライン引数B
/home/yossy/dotnet_sample

コマンドライン引数とカレントディレクトリのパスを表示し、
text.txt を出力しています。内容を覗いてみると。。。

$ cat test.txt
コマンドライン引数A
コマンドライン引数B

コマンドライン引数として渡した文字列が正しく格納されています。

Windowsで確認した動作と同じ結果となりましたね。
Linux上で.NET Framework を用いたプログラムが動作していることがわかります。




今回、簡単なサンプルプログラムを作ってみましたが、注意する点として、
WindowsとLinuxではパスの扱いが異なる。ということが挙げられます。

例えばディレクトリ階層を "¥¥" で連結しているようなプログラムは、
Windows側だと正しく動きますが、Linux側ではパス異常となります。

× Windows側でしか正しいパスにならない。
string path = Directory.GetCurrentDirectory() + "\\" + "test.txt";

 パス結合するライブラリを用いることでWindows/Linux共通で動作する
string path = Path.Combine(Directory.GetCurrentDirectory(),"test.txt")



OSに依存するような所はライブラリが吸収してくれるはずですので、
上手くそれらを使うようなプログラミングを心がけましょう。

ではまた~。

2018年11月3日土曜日

C#(.NET Framework)で作ったコンソールアプリを .NET Core を使ってLinuxで動かしてみる!【前編】


こんにちは。よっしーです。


さて今回は、タイトルにもある通り、

C#(.NET Framework)で作ったコンソールアプリをLinux上で動かす。

ということをご紹介したいと思います。


.NET Framework って Microsoft が提供してるから、

.NET Framework = Windows というイメージがありますが、

最近ではLinux上でも動作することが出来るんです。


さっそく Visual Studio 2017 Community でチャレンジしてみましょう。


プロジェクトの作成画面から以下を選択します。
 → Visual C#
  → .NET Core
   → コンソール アプリ(.NET Core)


実行すると 「Hello World!」 と出力されるテンプレートが作成されます。


今回は、.NET Framework が Linux上で動作するかを確かめたいので、
Systemのクラスライブラリを使って簡単なサンプルを組んでみました。

<内容>
・カレントディレクトリパスを取得
・コマンドライン引数とカレントディレクトリ名をコンソール出力
・カレントディレクトリにtest.txtを作成し、コマンドライン引数の内容をそのファイルへ出力


あとは、適当に Visual Studio 上から実行する際のコマンドライン引数と、
作業するディレクトリ(カレントディレクトリ)を情報として設定します。


Visual Studio上で実行してみましょう。もちろんWindows上で動作します。

動作結果として、
設定したコマンドライン引数とカレントディレクトリパスがターミナル上に出力され、
出力された test.txt にはコマンドライン引数の内容が出力されます。

まぁ、実装通りですね。。。


下準備はここまでです。

で、このプログラムを Linux 上で動作させるのが今回の目的となりますので、

次に進めていきましょう。


ビルドメニューから、○○○○(プロジェクト名) の発行 というのがあるので選択します。


次の画面に進むので、続けて 発行 を選択します。


すると、対象のディレクトリに以下のような生成物が出力されます。


DLLファイルが出力されていることがわかりますが、これが Linux上 で動作する
プログラムファイルとなります。

DLLなのに実行ファイル?と、Windows脳だとちょっとシックリこないのですが、
Linux で動作させる場合は、dotnet という実行ファイルに このDLLファイルを
指定して動作させるので、そんなに違和感は感じなくなります。

次は Linux 側での操作となりますが、ちょっと説明も長くなってきたので、
今回はここまでとさせてもらいます。

ではまた~。

2018年10月26日金曜日

Visual Studio Code でC言語をステップ実行

こんにちは、ふじかーです。

C言語をテキストエディタで書いているような 組み込み開発現場 では

(´-`)。oO( このロジックが意図通り動作するか、ちょいと手元で確認したい。。 )

みたいな時、少し困ります。

テキストエディタではそんな事できないし
VisualStudioの無償版は昔に比べて準備も大変だし、使うのも重いし不便。
業務のクロスコンパイル環境を立ち上げるのは、もっと大袈裟で面倒くさい。

ということで「軽量なツールで、C言語をお手軽にステップ実行できる環境」 を作成します。

以前、もりもり君が「なかなか使いやすいっスよ」とお勧めしてくれた
Visual Studio Code(以下、VS Code)を使います。

<手順>



コンパイラ(gcc)をインストール

  • ダウンロード・インストール
下記のサイトにアクセスし、一式おとしてインストールします。
http://www.mingw.org/download/installer
 → mingw-get-setup.exe のダウンロードが始まる
 → 実行して Install → Continue で進める
 → 「MinGW Installation Manager」が起動

  • gcc設定
C言語作業に必要なパッケージをインストールします。
 ・「mingw32-base」   を右クリックして「Mark for Installation」を選択し、チェックを入れる
 ・「mingw32-gcc-g++」を右クリックして「Mark for Installation」を選択し、チェックを入れる
 ・[Installation]→[Apply Changes]]→[Apply]→ セットアップが終われば [Close]


  • パスを通す
システムのプロパティから、環境変数のPathにgccのパスを追加します。
手順が分からない場合、下記参照。
 ・Windowsキー+R → [ファイル名を指定して実行] 画面が開く
 ・「sysdm.cpl」 と入力してEnter → [システムのプロパティ]画面が開く
 ・[詳細設定]タブ → 環境変数(N) → システム環境変数(S) エリアの 「Path」 を選択 → 編集(I)... をクリック
 ・[システム変数の編集] ダイアログの [変数値(V)] の末尾に 「;C:\MinGW\bin」 を追記して [OK]



VS Code 本体をインストール

  • ダウンロード・インストール
下記のサイトにアクセスして、本体をダウンロード・インストールする。
 https://code.visualstudio.com/Download


 → 64bit環境なら、[User Installer 64 bit] をクリック
 → VSCodeUserSetup-x64-X.XX.X.exe のダウンロードが始まる
   (記載時点ではVSCodeUserSetup-x64-1.28.2.exe)
 → 同意して、次へ次へ~でインストール完了。



  • 日本語化 
VS Code はバージョン1.25以降「デフォルト英語版のみ」になったため、
日本語化する必要があります。
 ・画面左の 拡張機能(Extensions)ボタン を押して「Japanese Language Pack」で検索 → Install → VS Codeを再起動



  • C/C++
C/C++開発用の拡張機能もインストールしておきます。
 ・こちらも拡張機能から「C/C++」で検索 → Install → VS Codeを再起動




作業場所、test.cの準備

  • test.c ファイル準備
VS Code からでも お手持ちのエディタでも良いですが、適当にHelloWorldソースを用意します。
#include 

int main(int argc, char *args[])
{
    printf("Hello, world!\n");
    return 0;
}
これを作業フォルダに保存しておきます(ここでは D:\test\test.c )。
またこの作業フォルダを、VS Code のメニューから開いておきましょう。
・メニュー → フォルダーを開く → D:\test



デバッグの為の設定

  • ビルドタスクの設定(tasks.json)
 修正したソースコードをビルドするための設定を行います。
 ・フォルダーを開いている状態で Ctrl+Shift+B
 ・「実行するビルドタスクがありません。ビルドタスクを構成する」というメッセージが出るのでクリック
 ・「テンプレートからtask.jsonを作成する」というメッセージが出るのでクリック
 ・表示された候補の中から「Others 任意の外部コマンドを実行する例」を選択
  → 作業フォルダ内に「.vscode/tasks.json」ファイルが自動生成され、画面に表示される


 ・表示された task.json の
"command": "echo Hello"
  を削除して、下記を挿入
"command": "gcc -g -O0 -o a.exe test.c",
"problemMatcher": "$tsc", 
"group": {
    "kind": "build",
    "isDefault": true
}
 ・Ctrl+S で保存しておく


  • デバッグ環境の設定(launch.json)
 デバッグに必要な設定を行います。
 ・画面左のデバッグアイコンを押下
 ・デバッグの開始アイコン(再生マーク)を押下
 ・表示された候補の中から「C++(GDB/LLDB)」を選択
  → 作業フォルダ内に「.vscode/launch.json」ファイルが自動生成され、画面に表示される


 ・表示された launch.json の
"program": "enter program name, for example ${workspaceFolder}/a.exe",
"miDebuggerPath": "/path/to/gdb",
  を削除して、下記を挿入
"program": "${workspaceRoot}/a.exe",
"miDebuggerPath": "c:\\mingw\\bin\\gdb.exe",
 ・Ctrl+S で保存しておく



デバッグ開始!


 ・試したいコードをmain関数に記載し、リビルドは Ctrl+Shift+B
 ・ブレークポイントをセットしてF5でデバッグ開始、F10でステップ実行


[デバッグの為の設定] を見ての通り、
 gcc を使って test.c を a.exe にビルドして、gdb を使ってデバッグする
というだけのシンプルな構成です。

既存のプロジェクト全体をデバッグするものでは無いけど、軽量だしIntelliSenceも使えるし、
ちょっと机上じゃ面倒な確認をしたい時とか、関数の単体試験などにも使えて便利。

とりあえず現場でも使ってるC環境の手順が整ったので
今度は別の言語も使えるように整備していこう。

※VS Codeは結構な頻度でバージョンアップを繰り返しており
 記事の内容(ver.1.28.2)と 最新のVS Codeとでは、手順や表示が若干異なるかも知れません。

2018年10月19日金曜日

Pythonでつまづいたことを細々とまとめてみる



こんにちは。よっしーです。

この1年ぐらい Python をちょいちょいとさわってきたのですが、
つまづいたところがいくつかあったので、備忘録としてまとめたいと思います。


・Pythonバージョンの 2.x系 と 3.x系 でコードの記法が違う。

 # 2.x 系の標準出力コード
  print 'hogehoge'

 # 3.x 系の標準出力コード
  print('hogehoge')

↑は代表例ですが、その他にもいろいろと書式が変わっています。

2.x系 で書かれたコードを、3.x環境で実行すると、実行時にエラーとなる。逆もまたしかり。
せめて下位verの互換ぐらいはして欲しかった。。。

conda(コンダ)などを使って、2.x系 と 3.x系 の環境切り替えも可能ですが、
2.x系 のサポートは2020年までなので、私は新しい 3.x系 でコードを組むことにしています。


・Ubuntu14.04/16.04 は 2.x系 がデフォルト設定となっている。

 # pythonのパスを表示
 $ which python
 /usr/bin/python

 # python のリンク先を表示(ver2.7を指している)
 $ ls -la /usr/bin/python
 lrwxrwxrwx 1 root root 9 12月 21  2013 /usr/bin/python -> python2.7

これ。ミソなのは、3.x系 も存在しているということ。

 $ ls -la /usr/bin/python*
 lrwxrwxrwx 1 root root       9 12月 21  2013 /usr/bin/python -> python2.7
 lrwxrwxrwx 1 root root       9 12月 21  2013 /usr/bin/python2 -> python2.7
 -rwxr-xr-x 1 root root 3341384 10月 27  2016 /usr/bin/python2.7
 lrwxrwxrwx 1 root root       9  3月 23  2014 /usr/bin/python3 -> python3.4
 -rwxr-xr-x 2 root root 3693624 11月 17  2016 /usr/bin/python3.4
 -rwxr-xr-x 2 root root 3693624 11月 17  2016 /usr/bin/python3.4m

/usr/bin/python のリンクを 3.x系 張り替えるとこで、3.x系 を使うことも可能です。

ただ、/usr/bin/python のリンクが 2.x なのか 3.x なのかに依存したくないので、
私は、実行する際のコマンドを明示的に python3 にするようにしています。

 # この指定だと、python の指しているリンクが 2.x なのか 3.x なのかによって実行エラーとなってしまう。
 python hoge.py

 # この指定だと、必ず 3.x で実行される
 python3 hoge.py


・辞書はとても便利。でも 3.6 以前だと入れた順にソートしてくれない。

 # 辞書に対して、
 dict = {}

 # 値を入れていく
 dict['one'] = 1
 dict['two'] = 2
 dict['three'] = 3
 dict['four'] = 4
 dict['five'] = 5

 # でも表示すると入れた順に並んでいない。
 print(dict)
 {'four': 4, 'three': 3, 'five': 5, 'two': 2, 'one': 1}

これ、3.6以降だと入れた順に並んでいるので、
自分の環境(3.7)では正しく動いているのに、
実環境(3.4)ではおかしな動きになる。ということがありました。

気付くまでにかなり時間がかかりました。

対応としては、OrderedDict(順序付辞書)を用いて回避しました。

 # 順序付辞書に対して、
 from collections import OrderedDict
 dict = OrderedDict()

 # 値を入れていく
 dict['one'] = 1
 dict['two'] = 2
 dict['three'] = 3
 dict['four'] = 4
 dict['five'] = 5

 # きちんと入れた順に並んでいる。
 print(dict)
 OrderedDict([('one', 1), ('two', 2), ('three', 3), ('four', 4), ('five', 5)])


Python は Ver依存でいろいろと問題があるなぁ~。
というのが正直な感想ですね。。。

ではまた~。

2018年10月13日土曜日

Excel作業がもっと捗るように

こんにちは、ふじかーです。

使ってますか?Excel。使ってますよね。

「Excel使うのは表計算だけにして、脱Excel だ!」
なんて声もありますが、

表計算以外のどんなドキュメントを作成する時も
なんだかんだで最も直感的に使いやすいので
結局みんなExcelに落ち着いているのが現状だと思います。

さて、このExcelを少しでも便利に使うために
私が実施している小技を紹介します。



クラシックスタイルメニュー


ほんと今更ですが、昔から慣れ親しんだExcelの メニューバー/ツールバー が
Excel2007以降「リボン」なる使いづらいI/Fに変わりました。

[新規作成] とか [印刷] とか [図形] とか、どこ・・・?

操作したいボタンが見つからず途方に暮れた人も多いと思います。
Outlookもそうですが、リボン本当に嫌い。

そんな「昔のメニュー形式の方が操作が早い!」という旧式の人間には
下記サイトの クラシックスタイルメニュー がお勧めです。

「クラシックスタイルメニュー for Office」

インストール方法
 1.上記サイトからZIPファイルをダウンロードして解凍
 2.「解凍フォルダ\アドインフォルダを開く.vbs」を実行 → アドイン置き場のフォルダが開かれる
 3.「解凍フォルダ\左端のタブに表示用\ClassicMenu.xlam」を、2.のアドイン置き場に格納
 4.Excelを起動し、
    [ファイル] - [オプション] - [アドイン]
 5.アドイン一覧が表示されるので「Classicmenu」を選択し、「設定(G)…」をクリック
 6.「有効なアドイン」の中にある「Classicmenu」をチェックし、「OK」ボタン


これで設定完了。「Classic Menu」タブが追加されています。

おなじみのボタンが。

クイックアクセスツールバーの活用


さらに快適に使うために
よく使う機能ボタンをタイトルバーに並べます。


①名前を付けて保存 ボタン
言わずもがな、リネームして保存したいときのボタン。
もともとある「上書き保存」ボタンの隣に配置します。

[ファイル] - [オプション] - [クイックアクセスツールバー]
→ コマンドの選択(C):「基本的なコマンド」
  の、一番下にあります。


②読み取り専用の設定/解除 ボタン
今現在開いているExcelファイルを
 読取専用 で開いている状態 にしたり
 上書保存可能 で開いている状態 にしたり
切り替えられるようにするボタンです。

ちょっと変わった機能なので、使うかどうか人によると思いますが
私はサーバ上のファイルを直接触る時などに結構使います。

[ファイル] - [オプション] - [クイックアクセスツールバー]
→ コマンドの選択(C):「リボンにないコマンド」
  の、下のほうにあります。

「リボンにないコマンド」のリストには、
よく見ると電卓とか面白いボタンがあったりします。
欲しいものがあれば追加しましょう。


貼り付けオプション が邪魔すぎる


セルの値をコピペしたとき右下あたりに出るコレ。

「貼り付けオプション」というらしいですが
その下のセルを次に触りたい時、この上なく邪魔でイラっとしませんか?

実はこいつ、下記の手順で非表示にできます。

[ファイル] - [オプション] - [詳細設定] - [切り取り、コピー、貼り付け]
→ 「コンテンツを貼り付けるときに [貼り付けオプション] ボタンを表示する(S)」のチェックボックスを外す


ハイパーリンク付き目次 を10秒で作る


Excelで設計書などを作っていて、複数シートに渡るブックになった場合
こんな目次シートが欲しくなったりします。

それぞれクリックすると該当ページにジャンプする「ハイパーリンク」になってたりすると
なお嬉しいんじゃないでしょうか。

これを10秒程度で作成する手順です。

作成手順
ALT + F11 で Visual Basic Editor を起動する
Ctrl + G  で画面下部に イミディエイトウインドウ を表示する
③イミディエイトウィンドウに下記コードを貼付ける
For Each i In ThisWorkbook.Sheets: debug.print "=HYPERLINK(""#'" & i.name & "'!A1"",""" & i.name & """)" : next i
④コードの上でEnter押下すると、下記のような ハイパーリンク一覧 が出力されるので、任意のセルにコピペ

=HYPERLINK("#'表紙'!A1","表紙")
=HYPERLINK("#'更新履歴'!A1","更新履歴")
=HYPERLINK("#'目次'!A1","目次")
=HYPERLINK("#'概要'!A1","概要")
=HYPERLINK("#'要求分析'!A1","要求分析")
=HYPERLINK("#'基本設計'!A1","基本設計")
=HYPERLINK("#'詳細設計'!A1","詳細設計")
=HYPERLINK("#'シーケンス'!A1","シーケンス")
=HYPERLINK("#'API仕様'!A1","API仕様")
=HYPERLINK("#'などなど'!A1","などなど")
(貼り付けた段階では 黒字 ですが、一度選択すると リンク状態 になります)

私の現場では「設計ドキュメントのテンプレートファイル」を置いて
皆それをベースに設計資料を作成していますが、
その目次シートに①~④の手順を書いたテキストボックスを貼り、活用しています。


では長くなってきたのでこの辺で。また小ネタあれば投稿します。

2018年10月5日金曜日

人生が捗るテレビ。レグザのタイムシフトマシン!


こんにちは。よっしーです。

今回は『テレビ』についてお話したいと思います。


この業界、システム開発に携わっている人は、遅くまで仕事があったりで、

なかなかテレビを見る時間が取れなかったりします。


録画して見るという選択肢もありますが、いちいちテレビ欄をチェックして、

録画設定するのも面倒だし、見たいテレビがあっても、録画予約を忘れてしまい

見れなかったりと。。。


そこまでしてテレビが見たいかと言われると、そうでもないし、

自分の中では「時間が合えば見る」程度のものでした。


そう。レグザのタイムシフトマシンに出会うまでは。。。


私が使っている東芝のレグザというテレビですが、

上位モデルには『タイムシフト』という機能があります。



このタイムシフトという機能。別途、ハードディスクが必要にはなりますが、

録画予約なしで、最大6番組を常時録画することができます。


ハードディスク容量、録画時間帯設定などで、過去何日分の番組を残せるかは異なってきますが、

我が家では、主要な地上デジタル放送の6番組を常時録画しており、

約2週間分のデータが常に取り溜めされています。


直近2週間分の録画した番組は「過去番組表」からいつでも見ることが出来ます。

もちろん録画した番組なので、CMなどは飛ばせますし、時短で見ることが可能となります。



また、テレビをつけて、面白そうだな。始めから見たいな。と思ったときも、

常時録画しているので「始めにジャンプ」というリモコンのボタンを押すだけで、

頭から番組を見ることも簡単に行えます。


本当にこのタイムシフト機能がすこぶる便利で、

テレビを見るために時間に縛られる。というのが一切なくなり、

空き時間で好きにテレビが楽しめるようになります。


一度この便利さを味わってしまうと、

タイムシフトがない生活にはもう戻れなくなります。


上位モデルということと、ハードディスクが必要ということから、

購入に少しお金はかかってしまいますが

「買ってよかったな」と思わせてくれるテレビです。


ただ、私のまわりでタイムシフト使っているよ。という人に会ったことがないので、

あまり認知というか、普及はされていないのかもしれません。


こんないい機能なのに、みんな知らないのはもったいない。

ということで、ここで紹介させてもらいました。タイムシフトマシンは超絶おススメです。

ではまた~。

2018年9月28日金曜日

EntityFrameworkでSQLiteを使ってみた!

Entity FrameworkもSQLiteもそれぞれ使ったことはあるのですが、今回初めてEntity FrameworkからSQLiteを使ったので
その方法をメモ。

まず、System.Data.SQLite.EF6.Migrationsパッケージをインストールします。
この時、もれなく

・EntityFramework
・System.Data.SQLite.Core
・System.Data.SQLite.EF6
・System.Data.SQLite.Linq
・System.Data.SQLite

もインストールされます。

DbContextクラス、エンティティクラスを作成します。
    public class SampleDbContext : DbContext
    {
        public DbSet<user> Users { get; set; }

        public SampleDbContext() : base("name = Sample")
        {
        }
    }

    public class User
    {
        public int Id { get; set; }

        public string Name { get; set; }
    }

App.configに接続文字列を追加します。

  <connectionStrings>
    <add name="Sample" connectionString="Data Source=C:\xxxxx\sample.db;" providerName="System.Data.SQLite.EF6" />
  </connectionStrings>

enable-migrations/add-migrationを実行すると、エラーが発生しました。

> enable-migrations
No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SQLite'. Make sure the provider is registered in the 'entityFramework' section of the application config file. 

> add-migration InitialCreate
No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SQLite'. Make sure the provider is registered in the 'entityFramework' section of the application config file. 


エラー内容に従って、App.configに設定を追加します。

    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
      <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    </providers>

再び、add-migrationを実行します。

> add-migration InitialCreate
System.ObjectDisposedException: 破棄されたオブジェクトにアクセスできません。
オブジェクト名 'SQLiteConnection' です。
   場所 System.Data.SQLite.SQLiteConnection.CheckDisposed()
   場所 System.Data.SQLite.SQLiteConnection.get_State()
   場所 System.Data.Entity.Internal.RepositoryBase.CreateConnection()
   場所 System.Data.Entity.Migrations.History.HistoryRepository.QueryExists(String contextKey)
   場所 System.Data.Entity.Migrations.History.HistoryRepository.Exists(String contextKey)
   場所 System.Data.Entity.Migrations.History.HistoryRepository.GetPendingMigrations(IEnumerable`1 localMigrations)
   場所 System.Data.Entity.Migrations.DbMigrator.GetPendingMigrations()
   場所 System.Data.Entity.Migrations.DbMigrator.Scaffold(String migrationName, String namespace, Boolean ignoreChanges)
   場所 System.Data.Entity.Migrations.Design.MigrationScaffolder.Scaffold(String migrationName, Boolean ignoreChanges)
   場所 System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.Scaffold(MigrationScaffolder scaffolder)
   場所 System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.RunCore()
   場所 System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()
破棄されたオブジェクトにアクセスできません。
オブジェクト名 'SQLiteConnection' です。


いろいろ調べてみましたが、原因がよく分かりません。
(SQLServer用接続文字列の場合、エラーは発生しません。)
あきらめて、DbContextクラスのデフォルトコンストラクタで、接続文字列を指定することにしました。
public SampleDbContext() : base(new SQLiteConnection($"Data Source = {Properties.Settings.Default.DatabaseFilePath};"),
false)
{
}

三度、add-migrationを実行します。

> add-migration InitialCreate
No MigrationSqlGenerator found for provider 'System.Data.SQLite'. Use the SetSqlGenerator method in the target migrations configuration class to register additional SQL generators.


Configurationクラスのコンストラクタにメソッド呼び出しを追加します。
public Configuration()
{
    AutomaticMigrationsEnabled = false;
    SetSqlGenerator("System.Data.SQLite", new SQLiteMigrationSqlGenerator());
}

add-migration/update-databaseを実行するとデータベースファイルが作成されました。
余談ですが、データベースファイルパスにフルパスではなくファイル名のみ指定すると、
下記のようなエラーが発生するのでご注意を。

> update-database
System.Data.Entity.Core.ProviderIncompatibleException: CreateDatabase is not supported by the provider.
   場所 System.Data.Entity.Core.Common.DbProviderServices.DbCreateDatabase(DbConnection connection, Nullable`1 commandTimeout, StoreItemCollection storeItemCollection)
   場所 System.Data.Entity.Core.Common.DbProviderServices.CreateDatabase(DbConnection connection, Nullable`1 commandTimeout, StoreItemCollection storeItemCollection)
   場所 System.Data.Entity.Core.Objects.ObjectContext.CreateDatabase()
   場所 System.Data.Entity.Migrations.Utilities.DatabaseCreator.Create(DbConnection connection)
   場所 System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   場所 System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   場所 System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
   場所 System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
   場所 System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore()
   場所 System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()
CreateDatabase is not supported by the provider.


またいつか、どこかで。