.NET Core で 実行ファイル(exe)を作成する方法
2024/01/22 追記
FDDは未知の原因不明なエラーが発生する場合があります。
何か特別な理由が無い限りはSCDを推奨します。
Ⅰ. はじめに
この記事の内容は.NET Core 3.0までの内容です。
最新の情報は以下Webページを確認して下さい。
https://docs.microsoft.com/ja-jp/dotnet/core/tools/dotnet-publish
Ⅱ. FDD と SCD の違いについて
デプロイ方法の名称 | 略称 | 実行方法(.NET Core 2.0) | 実行方法 (.NET Core 3.0) |
---|---|---|---|
Framework-dependent deployments フレームワークに依存する展開 |
FDD | コマンドを実行する dotnet hoge.dll |
EXEを実行する |
Self-contained deployments 自己完結型の展開 |
SCD | EXEを実行する | EXEを実行する |
SCD は CoreCLR と呼ばれる .NET Core のランタイムも出力する為、.NET Core ランタイムが入っていない環境でも実行することができます。
.NET Core 3.0 以上の場合
標準でフレームワーク依存(FDD)のexeファイルが出力されます。
.NET Core 2.x 以下の場合
FDD では実行ファイル(.exe)の作成ができません。
SCD で実行ファイル(.exe) を作成します。
Ⅲ. FDD のやり方
以下のコマンドを実行する
dotnet publish -c Release
以上
Ⅳ. SCDのやり方
1. 以下のコマンドを実行する
RID(Runtime Identifier) と呼ばれる値はこちらからコピペします。
https://docs.microsoft.com/en-us/dotnet/articles/core/rid-catalog
dotnet publish -c Release -r win-x64 # dotnet publish -c Release -r osx-x64 # dotnet publish -c Release -r linux-x64
2. 実行ファイルが作成される
その他
※2018/12/11 追記
.NET Coreで実行ファイル1つだけを出力する方法(Warpを利用する場合)(非推奨)
https://kagasu.hatenablog.com/entry/2018/12/11/021919
※2019/05/08 追記
.NET Coreで実行ファイル1つだけを出力する方法
https://kagasu.hatenablog.com/entry/2019/05/08/022255
※2019/01/04追記
.NET CoreをCoreRTを利用してビルドする方法
https://kagasu.hatenablog.com/entry/2019/01/04/121434
C#でプロセスのスレッド一時停止させる
Ⅱ. プログラム
Program.cs
var process = Process.GetProcessesByName("notepad").FirstOrDefault();
process.Threads.Suspend();
process.Threads.Resume();
ProcessExtensions.cs
public static class ProcessExtensions { [Flags] private enum ThreadAccess : int { TERMINATE = 0x0001, SUSPEND_RESUME = 0x0002, GET_CONTEXT = 0x0008, SET_CONTEXT = 0x0010, SET_INFORMATION = 0x0020, QUERY_INFORMATION = 0x0040, SET_THREAD_TOKEN = 0x0080, IMPERSONATE = 0x0100, DIRECT_IMPERSONATION = 0x0200 } [DllImport("kernel32.dll")] private static extern bool CloseHandle(IntPtr hHandle); [DllImport("kernel32.dll")] private static extern IntPtr OpenThread(ThreadAccess dwDesiredAccess, bool bInheritHandle, uint dwThreadId); [DllImport("kernel32.dll")] private static extern uint SuspendThread(IntPtr hThread); [DllImport("kernel32.dll")] private static extern uint ResumeThread(IntPtr hThread); public static void Suspend(this ProcessThreadCollection threads) { foreach (ProcessThread x in threads) { var threadHandle = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)x.Id); if (threadHandle != IntPtr.Zero) { try { SuspendThread(threadHandle); } finally { CloseHandle(threadHandle); } } } } public static void Resume(this ProcessThreadCollection threads) { foreach(ProcessThread x in threads) { var threadHandle = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)x.Id); if (threadHandle != IntPtr.Zero) { try { ResumeThread(threadHandle); } finally { CloseHandle(threadHandle); } } } } }
プロテクトを回避してメモリをフルダンプする
Ⅰ.はじめに
物理メモリを任意の物理記憶媒体にダンプする方法です。
Belkasoft社の無料ダンプツール(Belkasoft Live RAM Capture)を利用します。
Ⅱ. Belkasoft Live RAM Captureのすごいところ
- 無料
ダンプ後のファイルを解析するBelkasoft Evidence Center は有料ですが、Belkasoft Live RAM Capture は無料で配布されています。
- 簡単に任意のタイミングでダンプが可能
アプリケーション単位のメモリであれば任意のタイミングでダンプ可能ですが、
物理メモリのフルダンプはシステムのクラッシュ時にのみ可能です。
従来の方法ではBSoDを意図的に発生させシステムをクラッシュさせてフルダンプを取らなければいけません。
- プロテクトの回避が可能
アンチデバッグやダンププロテクションといったメモリダンプを妨げるものを回避してメモリのダンプが可能です。
Ⅲ. メモリダンプ方法
1. Belkasoft Live RAM Captureをダウンロードする
2. 保存先を指定し、Captureをクリックする
3. 以上でダンプ完了です。
Ⅳ. ダンプから画像ファイルを取り出す
Belkasoft Evidence Center(有料。高機能。試用可能)でも可能ですが、今回はWinHex(有料。試用可能)を利用します。
1. WinHexでダンプしたファイルを読み込む
2. Tools -> Disk Tools -> File Recovery by Type
3. Picturesにチェックを入れてOKをクリックする
4. メモリダンプから画像ファイルが生成されます
一時的なメールサービスのAPIサーバを作る
Ⅰ. はじめに
一時的なメールアドレスを作成するサービスはいくつか存在します。
一時的なメールアドレスを作成する - 備忘録
しかし、どのサービスもAPI経由でのアクセスが出来ないものばかりです。
送信されるリクエストを解析してサービスを利用する事も可能ですが、
よりスマートにAPIアクセス可能なサーバを自分で構築する方法を紹介します。
※サーバを構築しなくても こちら(restmail.net) から制限付きで利用することも可能です。
※こちらを応用して自分で作るのもアリです。
Ⅱ. やり方
0. 環境
[root@host ~]# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core)
1. screen, git, nodejs, redis をインストールする
yum -y install screen git nodejs redis
2. restmail.net を入手する
git clone https://github.com/mozilla/restmail.net
3. Node.js のモジュールをインストールする
npm install
4. Redis を起動する
systemctl start redis
5. lib/config.js の port を 9025 から 25 に変更する
6. lib/config.js の webPort を 8080 から 80 に変更する
8. ポートを開放する。25番と80番
firewall-cmd --zone=public --add-port=25/tcp --permanent firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --reload
9. サーバを起動する
node webserver.js & node emailserver.js &
または screen を利用して
screen -S webserver node webserver.js [Ctrl + A] → [D] screen -S emailserver node emailserver.js [Ctrl + A] → [D]
10. http://[ip address]/にアクセスして、以下のページが表示されることを確認する