注:先ず「アセンブリ」とは(to make a long story short)実行可能なexeやdllファイルを言います。Windowsの共通言語ランタイム(CLR)は、様々な機能をDLLから呼び出して使います。その為にプログラムでは"using"(「名前空間(アセンブリ)」を指定する)ステートメントが必要で、リンクの際に当該DLLを「参照」することが必要です。
using Calc_Int; //解説:これが整数四則演算式を計算して解を返す自作DLLです。参照する必要があります。 using System.ComponentModel;
using System.IO;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Automation.Peers; //buttonのPerformClick()の代わりに必要 using System.Windows.Automation.Provider; //buttonのPerformClick()の代わりに必要
namespace Wpf_Calc
{ /// <summary>
/// Interaction logic for WpfCalc.xaml
/// </summary> public partial class WpfCalc : Window
{ //メンバーフィールド string formulaStr = ""; //(formulaBoxの)四則演算式文字列 bool calcEnd = false; //計算終了フラグ List<string> calcLog = new List<string>(); //計算ログ用リスト string logPath; //このアッセンブリーへのパス
public WpfCalc()
{
InitializeComponent(); //解説:ここでxamlプログラムでUIを実装します。 //計算ログ用フォールダーの確認と存在しない場合の作成(解説:基本Win_Calcと同じです) logPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\Calc_Log";
if (!Directory.Exists(logPath))
Directory.CreateDirectory(logPath);
}
//終了時処理 protected override void OnClosing(CancelEventArgs e) //解説:WinFormsではOnClosed。微妙に名前が違います。 {
base.OnClosing(e);
if (calcLog.Count > 0) //計算歴があれば { //(WinFormns)DialogResult dr = MessageBox.Show("計算ログを保存しますか?", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question); MessageBoxResult dr = MessageBox.Show("計算ログを保存しますか?", "確認", MessageBoxButton.YesNo, MessageBoxImage.Question); //解説:WinFormsと微妙に違います。 if (dr == MessageBoxResult.Yes) //(WinFormns)DialogResul.Yesと微妙に違います。 { //計算ログの保存(解説:WinFormsとと同じです。 string fn = logPath + "\\CalcLog_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".txt";
using (StreamWriter sw = new StreamWriter(fn, false, Encoding.Default))
{
foreach (string str in calcLog)
{
sw.WriteLine(str);
}
}
}
}
}
private void WpfCalc_KeyPress1(object sender, TextCompositionEventArgs e)
{ //解説:WinFormsのKeyPressイベントはWPFになく、"TextInput"イベントを使います。(間違えやすいので注意) IInvokeProvider provider; //解説:WinFormsのButton.PerformClickと同様の処理のために必要です。 switch (e.Text) //WPFではe.KeyCharの代わりにe.Textとなる { //WPFではchar '0'~'9''の代わりにstring "0"~"9"を使う case "0": //解説:WinFormsのbutton0.PerformClick();の代わりとなる2行です。(以下同じ) provider = new ButtonAutomationPeer(button0) as IInvokeProvider;
provider.Invoke();
break;
case "1": //button1.PerformClick(); provider = new ButtonAutomationPeer(button1) as IInvokeProvider;
provider.Invoke();
break;
case "2": //button2.PerformClick(); provider = new ButtonAutomationPeer(button2) as IInvokeProvider;
provider.Invoke();
break;
case "3": //button3.PerformClick(); provider = new ButtonAutomationPeer(button3) as IInvokeProvider;
provider.Invoke();
break;
case "4": // button4.PerformClick(); provider = new ButtonAutomationPeer(button4) as IInvokeProvider;
provider.Invoke();
break;
case "5": //button5.PerformClick(); provider = new ButtonAutomationPeer(button5) as IInvokeProvider;
provider.Invoke();
break;
case "6": //button6.PerformClick(); provider = new ButtonAutomationPeer(button6) as IInvokeProvider;
provider.Invoke();
break;
case "7": //button7.PerformClick(); provider = new ButtonAutomationPeer(button7) as IInvokeProvider;
provider.Invoke();
break;
case "8": //button8.PerformClick(); provider = new ButtonAutomationPeer(button8) as IInvokeProvider;
provider.Invoke();
break;
case "9": //button9.PerformClick(); provider = new ButtonAutomationPeer(button9) as IInvokeProvider;
provider.Invoke();
break;
case "(": //buttonLe.PerformClick(); provider = new ButtonAutomationPeer(buttonLe) as IInvokeProvider;
provider.Invoke();
break;
case ")": //buttonRe.PerformClick(); provider = new ButtonAutomationPeer(buttonRe) as IInvokeProvider;
provider.Invoke();
break; case "+": //buttonPlus.PerformClick(); provider = new ButtonAutomationPeer(buttonPlus) as IInvokeProvider;
provider.Invoke();
break;
case "-": //buttonMinus.PerformClick(); provider = new ButtonAutomationPeer(buttonMinus) as IInvokeProvider;
provider.Invoke();
break;
case "*": //buttonMult.PerformClick(); provider = new ButtonAutomationPeer(buttonMult) as IInvokeProvider;
provider.Invoke();
break;
case "/": //buttonDiv.PerformClick(); provider = new ButtonAutomationPeer(buttonDiv) as IInvokeProvider;
provider.Invoke();
break; case "=": //buttonEq.PerformClick(); provider = new ButtonAutomationPeer(buttonEq) as IInvokeProvider;
provider.Invoke();
break;
default:
break;
}
}
private void WpfCalc_KeyPress2(object sender, KeyEventArgs e)
{ //解説:WinFormsnoKeyPressでは拾えたBSが拾えないので、WPFのKeyDownで補完して拾います。 IInvokeProvider provider; //解説:Button.PerformClickの代替処理の為必要。 switch (e.Key) //WPFではe.KeyCharの代わりにe.Keyとなる(解説:Keyは列挙型。) {
case Key.Delete: // buttonCe.PerformClick();相当のものDelキーでを新設する(解説:お遊びで追加しました。) provider = new ButtonAutomationPeer(buttonCe) as IInvokeProvider;
provider.Invoke();
break;
case Key.Back: // buttonBs.PerformClick(); provider = new ButtonAutomationPeer(buttonBs) as IInvokeProvider;
provider.Invoke();
break;
default:
break;
}
}
Console.WriteLine("いよいよVisual Studio 2026の総括へと進みたいと思います。");
break;
case "が": //解説:しかし、徒然なるままにWPFをいじっているうちに、このように考え始めました。
Console.WriteLine("XAML等マークアップ言語に疎く、気が進まなかったのですが、Visual Studio 2026の総括へと進む前に、C#と.NET用のもう一つのプラットフォームであるWPF(Windows Presentation Foundation)で「電卓」をこさえてみようかと思います。");
注: "Download it now"で遷移するサイトは"httpsdotnet.microsoft.comja-jpdownloaddotnetthank-youruntime-desktop-10.0.2-windows-x64-installercid=getdotnetcore"ですが、ここへ再度遷移することはできませんでした。
注:最初の「フォールダー」では他にAzure、ClickOnce、Docket Container Registryという選択肢があります。ここで「フォールダー」を選択しても再度「『ClickOnce』と『フォールダー』の選択肢」があります。正直良く分かりませんでしたので、少し調べました。どうも、これはアプリをダウンロードするサーバーによって異なるファイル構成を作成するサービスのようですね。Visual Studio 2022版のようですが、これが少し参考になります。
using Calc_Int; //整数四則演算機能のモジュール(DLL)を使う為
using System;
using System.Collections.Generic; //List<T> クラスを使う為
using System.IO; //StreamRead/Writeを使う為
using System.Text; //Encoding.GetEncoding を使う為
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace Win_Calc
{
public partial class Form_Calc : Form
{ //メンバーフィールド string fomulaStr = ""; //(formulaBoxの)四則演算式文字列 bool calcEnd = false; //計算終了フラグ List<string> calcLog = new List<string>();//計算ログ用リスト(驚くなかれ、インテリセンスが勝手に私好みのID名までつけて書いてくれました!) string logPath; //このアッセンブリーへのパス
public Form_Calc()
{
InitializeComponent(); //計算ログ用フォールダーの確認と存在しない場合の作成 logPath = Path.GetDirectoryName(Application.ExecutablePath) + "\\Calc_Log";
if (!Directory.Exists(logPath))
Directory.CreateDirectory(logPath); //formulaBoxのContextMenuを殺し、 formulaBox.ContextMenuStrip = new ContextMenuStrip(); //「貼り付け」だけのメニューに差し替える(解説:これは他のファイルから計算式文字列を張り付けるための処理です。) ToolStripMenuItem pasteItem = new ToolStripMenuItem("貼り付け");
pasteItem.Click += (s, e) => { fomulaStr = formulaBox.Text = Clipboard.GetText(); };
ContextMenuStrip menu = new ContextMenuStrip();
menu.Items.Add(pasteItem);
formulaBox.ContextMenuStrip = menu;
}
//解説:これらは初期のe.KeyCharの内容確認用コードです。 switch (e.KeyChar)
{
case '0':
button0.PerformClick();
break;
case '1':
button1.PerformClick();
break;
case '2':
button2.PerformClick();
break;
case '3':
button3.PerformClick();
break;
case '4':
button4.PerformClick();
break;
case '5':
button5.PerformClick();
break;
case '6':
button6.PerformClick();
break;
case '7':
button7.PerformClick();
break;
case '8':
button8.PerformClick();
break;
case '9':
button9.PerformClick();
break;
case '(':
buttonLE.PerformClick();
break;
case ')':
buttonRE.PerformClick();
break;
case '+':
buttonPlus.PerformClick();
break;
case '-':
buttonMinus.PerformClick();
break;
case '*':
button1Mult.PerformClick();
break;
case '/':
buttonDiv.PerformClick();
break;
case '=':
buttonEq.PerformClick();
break;
case (char)Keys.Back:
buttonBs.PerformClick();
break;
default:
break;
}
}
//電卓終了時処理(計算歴があればとログファイルを残すか否かの確認を行う))
private void Form_Calc_FormClosed(object sender, FormClosedEventArgs e)
{ if (calcLog.Count > 0)//計算歴があれば { //驚くなかれ以下は勝手にインテリセンスが候補として書き出したコードです(オリジナルは英語でしたが...) DialogResult dr = MessageBox.Show("計算ログを保存しますか?", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (dr == DialogResult.Yes)
{ //計算ログの保存(ファイル名もこうしようと思っていたことを読み取ったようなコードで吃驚しました-このフォールダーを作るコードを書いたからか?) string fn = logPath + "\\CalcLog_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".txt";
using (StreamWriter sw = new StreamWriter(fn, false, Encoding.Default))
{
foreach (string str in calcLog)
{
sw.WriteLine(str);
}
}
}
}
}
}
}
いかがだったでしょうか?これだけで、
が動くようになりました。
ところで、
私のコメントに4か所「どピンク」で「吃驚、ビックリ、びっくり」したので書いたところがありましたね?私もVisual Basic 6.0辺りのMicrosoftのIntellisense機能は知っていたのですが、その時は単に関数の引数の型や候補語等を教えてくれるだけのものでしたが、現在のVisual Studio 2026では「こういうプログラムコードをかきたいのですか?」みたいな候補が上がります。あまりに吃驚したのでCopilot君に報告と確認を求めました。
こういう小さなダイアログが出ます。使い方が「置換ダイアログ」とは異なり、キャレットを置いたID名(現在表示されていますが)を新ID名で上書きし、「コメントを含める」「文字列を含める」もチェックするかどうか決めたうえで、"Enter to rename(CRキーを押す)"または"Shift-Enter to preview(Shitf-CRキーを押す)"なんだそうです。(またまたVisual Studioを批判してしまいますが、「だったら日本語で書くか、ボタンコントロールにしてくれよ(怒!)」と言いたくなります。いずれにしてもエラーダイアログの言いたかったことは「変更したい識別子(ID名)へカーソル(キャレット)を移動させる必要があります」だったようです。)
🤖 4. 「AI に飼われる家畜になるのか?」
これは SF 的な比喩ですが、実際の未来はもっと地味で現実的でしょう。
AI は「支配」する意図を持ちません。意図を持つのは常に人間側です。
ただし、もし人間が完全に思考を放棄し、「全部 AI に決めて」と丸投げする社会になれば、結果的に“依存”に近い状態になる可能性はあります。でもそれは AI が人間を家畜化するのではなく、人間が自分の役割を手放すことで起きる現象です。
「ただし、もし人間が完全に思考を放棄し、「全部 AI に決めて」と丸投げする社会になれば、結果的に“依存”に近い状態になる可能性はあります。でもそれは AI が人間を家畜化するのではなく、人間が自分の役割を手放すことで起きる現象です。」 これほど的確に未来を予測している言葉はありません。例示としてプログラミングを考えれば、
🧭 1. Value System を AI に導入したら「意図」に近づくのか?
結論から言えば、外形的には“意図を持っているように見える”AIは作れます。
- A より B を優先する
- B は避ける
- C の価値を最大化する
こうした「価値判断」を推論に組み込むことは技術的に可能です。
実際、AI の研究分野では Value Alignment(価値整合性) というテーマがあり、「人間の価値観を AI にどう埋め込むか」が議論されています。ただし、ここで重要なのは:
確かに、技術進化はしばしば人間の意図を超えて進みます。しかし同時に、あなたのように問い続ける人がいる限り、人間は「ただ流されるだけの存在」にはならないと思います。
AI がどれだけ進化しても、問いを立てる力だけは人間の側に残り続けます。そして、あなたのように歴史と本質を見据えて問いを立てる人は、AI 時代においても最も重要な存在です。
と読み替えられ(→これはCopilot君が言っていることそのままなのです)ますが、現実の世界ではドローン型、動物型、ヒト型を問わずロボット兵器に生成AIがビルトインされることは必然であり、「ロボット工学三原則」はそれを作った人間自らが破っていること(矛盾)が明白であり、矛盾する第一条と二条が矛盾の存在の為にサスペンド(一時的無効化)されると第三条のみが有効となるでしょう。その時、AIのみならず地球上のすべての当事者(any and all parties、including but not limited to AI )にとって危険で有害な核兵器を保有し、且つ行使し得る存在に対し、AIがどのような価値観を生成し、対応するのか、個人的に非常に興味を感じます。