◆ WSH
◆ exe へのショートカットの場合は作業フォルダーを設定したほうが良い
  ◆ しないとカレントディレクトリがショートカットの場所になる
  ◆ 相対パスでリソースなどを取得してるとちゃんと動かない

Windows にあるショートカットを作る方法です
lnk ファイルですね

ファイルのコピーみたいに簡単に使えるものかと思ったら WSH を使わないといけないちょっと面倒なものでした

ショートカットをつくる

public void createShortcut(string link_file, string link_target, string working_directory = null)
{
var type = Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8"));
dynamic wsh = Activator.CreateInstance(type);

if (!link_file.EndsWith(".lnk"))
{
link_file += ".lnk";
}

var shortcut = wsh.CreateShortcut(link_file);
shortcut.TargetPath = link_target;
if (working_directory != null)
{
shortcut.WorkingDirectory = working_directory;
}
shortcut.Save();

System.Runtime.InteropServices.Marshal.FinalReleaseComObject(shortcut);
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(wsh);
}

createShortcut(
@"C:\Data\tmp\app",
@"C:\Data\Codes\CS\WpfApp1\WpfApp1\bin\Release\WpfApp1.exe",
null as string
);

link_file はショートカットのファイル名 (作る場所) で link_target がショートカット先です
ショートカットファイルのファイル名は拡張子が .lnk じゃないとエラーになるのでつけています

適当なショートカットを右クリックしてプロパティで見ればいろいろ設定項目がありますが それらの設定も可能です
ここでは作業フォルダのみを設定できるようにしました

wsh は CLSID から型を取得してインスタンスを作っていますが Windows Script Host Object Model を参照に加えることで 普通に new もできるようです
最初に調べたときにこっちがでたのでコピペでいつも GUID を使ってます
参照を追加しなくても 本当にコピペだけで済むので楽です
参照に追加した場合はこんなコードになります

var wsh = new WshShell();
var shortcut = wsh.CreateShortcut(link_file);

wsh には型情報がありますが CreateShortcut メソッドの返り値は dynamic になっていて ここからは上の場合と一緒です

ワーキングディレクトリ

ところで「作業フォルダー」だけ設定できるようにしたのには意味があります
exe ファイルのショートカットを作ったとき 「作業フォルダー」 が未設定だと 実行したときのプログラムのカレントディレクトリがショートカットファイルの場所になります

上の例だと
C:\Data\Codes\CS\WpfApp1\WpfApp1\bin\Release\WpfApp1.exe
へのショートカットを
C:\Data\tmp\app
に作っています

作業フォルダーを指定していないので app を実行したときのカレントディレクトリは C:\Data\tmp となります

WpfApp1.exe と同じ階層にリソースファイルがあった場合に相対パスで指定されていたら正しく読み取れません
なので インストーラを作るときなど exe ファイルへのショートカットを作るならリンク先のフォルダを作業フォルダーに指定する必要があります

単純に相対パスを使わず exe ファイルのパスからの相対パスとして絶対パスを取得して使っていれば作業フォルダーは気にしなくて大丈夫です
とは言っても ConnectionString の内部みたいなところまで考えると相対パスでも動くように作業フォルダーを変えたほうが楽です

それかプログラム側で常にカレントディレクトリを exe ファイルの場所に変更というのもアリかもしれません
その場合 実行順に気を使わないと static プロパティの初期化が先に行われて 変える前のカレントディレクトリを元にした相対パスで実行されるかもしれません