20210504のC#に関する記事は5件です。

Visual Studio 2022 に備えて大量の C# アプリを一気に作る

2021年4月19日に Visual Studio 2022 のアナウンスブログが公開されました。 Visual Studio 2022 | Visual Studio Blog ※注意:本記事執筆時点では、まだ Visual Studio 2022 はリリースされていません。 Visual Studio 2022 の最大の特徴としては 64ビット化されるということです。 つまり、巨大なアプリケーションの開発時でも Visual Studio がメモリ不足に陥りにくいということです。 上記のブログでも 1600 のプロジェクトを含むソリューションの起動の様子が載っています。 Visual Studio 2022 がリリースされた暁には私も同じ様子を体感したいので、巨大なソリューションを一気に作れるようにします。 .NET Core ならコマンドライン (CLI) が提供されているため、すべてコマンドでソリューションファイルやプロジェクトファイルを作ることが可能です。 for文でひたすらに作っていきましょう! SOLUTION_NAME=HugeDotnetSolution dotnet new sln -o $SOLUTION_NAME cd $SOLUTION_NAME for i in `seq 1000` do APP_NAME=ConsoleApp$i dotnet new console -n $APP_NAME --no-restore dotnet sln $SOLUTION_NAME.sln add $APP_NAME done (追記)上記のコマンドで C# のプロジェクトを 1000個 つくってみた動画を載せておきます。 プロジェクトのリストアは行わないようにしていますが、私の環境では30分かかりました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

unityでスマホゲーム制作までのお勉強用記録記事1

今日から毎日勉強の記録を保存していくだけのメモ帳 現在unityで2Dマリオの用なゲームを練習で1本作成した。 しかし作成期間が長かったので結構忘れてることが多く、新しいゲームを作るのが困難だったため再度記録用も含めて記事を作成。 1日中家にいない日もあるので、そういう日以外で記録を付けていきます。 Void_Start() { Debug.Log("ゲーム制作がんばるぞ!"); }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

最小限の環境構築したVSCodeでC#のexeを作る

何がしたいの? VSCodeでC#のexeを作りたい。 ひとまず 最小限の環境構築 で 最小限のサンプルプログラム が作れればヨシッ! VSCodeインストール VSCodeはインストール済で話を進めます。 まだの場合は こっち 。 VSCodeにC#のプラグインをインストール プラグインのメニューを開いて csharp で検索してインストール。 .NET Coreをインストール ↓公式サイトさんへ。 https://dotnet.microsoft.com/download 下記のようにインストーラーをダウンロードしてインストール。 プロジェクト作成 適当にフォルダーを作った後に、VSCodeでそのフォルダーを開く! Ctrl + @ でターミナルを開いて下記コマンド。 コマンド dotnet new console 下記のように初期化してくれます。 はろーわーるどをコンソール出力するプログラムも用意してくれてます。 とりあえず実行 VSCodeのターミナルで下記コマンド。 コマンド dotnet run ハローワールド出てます。 プログラムの中身をちょっとだけ変えて… dotnet run を実行。 変更が反映されてます。 exeをエクスプローラー経由で実行 exeは下記にあります。 コンソール出力だけだと一瞬でプログラムが終了して、本当に作ったプログラムが動いているかの確認ができないです。 なので、コンソールを入力待ちの状態にする Console.ReadKey(); を追加して、 dotnet run で一回コンパイルしておきます。 VSCode経由ではなく、エクスプローラー経由で出来上がったexeを実行してみまーす。 ちゃんと『ほげええええええええ』が出て入力待ち状態になりました。 蛇足 『exe を作るなら Visual Studio』が普通だけど、選択肢は多いに越したことはないかなって思います。 参考サイトさん https://www.typea.info/blog/index.php/2017/06/19/visual_studio_code_c_exe/ https://ict119.com/console_stop/ バージョン Windows 10 Pro バージョン 20H2 OSビルド 19042.928 Visual Studido Code 1.55.2
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Windows フォームアプリケーションで MessagePipe を利用する

このドキュメントの内容 先日リリースされた MessagePipe をWindowsフォームアプリケーションで利用する方法を説明します。 Windowsフォームアプリケーションでは DI が利用されるケースは多くはないため、DI に関する記事が少ないのが現状です。 MessagePipe そのものの説明ではなく、MessagePipe を利用するために DI 環境を整える方法になります。 プロジェクトを作成する MessagePipe がサポートするフレームワークは .NETStandard2.0 または .NET5.0 です。プロジェクトテンプレートは Windows Forms App (.NET) を使用するとよいでしょう。 MessagePipe と関連するライブラリをインストールする Nuget で次のパッケージをインストールしてください。 MessapePipe Microsoft.Extensions.DependencyInjection エントリポイントに DI の初期処理を実装する Microsoft.Extensions.DependencyInjection では、DI でインスタンスを生成したい型をあらかじめ ServiceCollection に登録しておく必要があります。ServiceCollection から生成された ServiceProvider を通じてインスタンスを生成することができるようになります。 MessagePipe で提供される拡張メソッド AddMessagePipe を呼び出せば標準的な型が登録されますが、Windowsフォームアプリケーションの場合は IPublisher などの型は登録されません。使用したい型を登録する必要があります。 MessagePipe/src/MessagePipe/ServiceCollectionExtensions.cs の内容を参照してください。 フォームのコンストラクタに DI で生成したインスタンスを渡したい場合、フォームも ServiceCollection に登録します。 フォームに ServiceProvider を渡し、フォーム内でそのインスタンスを生成するような設計も考えられます。なお、ServiceProvider をそのまま渡すよりもコンテキストのような管理クラス内に内包させて渡したほうがよいと思います。 Program.cs using MessagePipe; using Microsoft.Extensions.DependencyInjection; namespace WindowsFormsApp1 { static class Program { /// <summary> /// アプリケーションのエントリポイント /// </summary> [STAThread] static void Main(string[] args) { // MessagePipe を使用するためのサービスを生成する ServiceCollection services = CreateMessagePipeServices(); // フォームのインスタンスをDIで生成する場合はアプリケーションのフォームを登録する services.AddTransient<Form1>(); // サービスプロバイダーを生成する ServiceProvider provider = services.BuildServiceProvider(); // Windowsフォームアプリケーションの既定の初期処理 Application.SetHighDpiMode(HighDpiMode.SystemAware); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // これではDIを利用できない // 後述するどちらかの方法でフォームのインスタンスを生成してアプリケーションを開始する // Application.Run(new Form1()); // サービスプロバイダーからフォームのインスタンスを生成する // コンストラクタの引数に定義された MessagePipe のインスタンスが注入される Application.Run(provider.GetRequiredService<Form1>()); // サービスプロバイダーを内包したコンテキストを渡す // フォーム内で MessagePipe のインスタンスを生成する Application.Run(new Form1(new MyContext(provider))); } /// <summary> /// MessagePipe を使用するためのサービスを生成します。 /// </summary> /// <returns></returns> static ServiceCollection CreateMessagePipeServices() { ServiceCollection services = new ServiceCollection(); // MessagePipe の標準サービスを登録する services.AddMessagePipe(options => { // 全てのメッセージに適用したいフィルタはグローバルフィルタとして定義するとよい options.AddGlobalMessageHandlerFilter(typeof(SampleFilter<>)); } ); // 使用するメッセージを登録する services.AddSingleton(typeof(MessagePipe.IPublisher<,>), typeof(MessageBroker<,>)); services.AddSingleton(typeof(MessagePipe.ISubscriber<,>), typeof(MessageBroker<,>)); return services; } } /// <summary> /// サービスプロバイダを内包したコンテキスト /// </summary> internal class MyContext { internal MyContext(ServiceProvider serviceProvider) { m_ServiceProvider = serviceProvider; } private readonly ServiceProvider m_ServiceProvider; public IPublisher<TKey, TMessage> CreatePublisher<TKey, TMessage>() { return m_ServiceProvider.GetRequiredService<IPublisher<TKey, TMessage>>(); } public ISubscriber<TKey, TMessage> CreateSubscriber<TKey, TMessage>() { return m_ServiceProvider.GetRequiredService<ISubscriber<TKey, TMessage>>(); } } /// <summary> /// サンプルフィルタ /// </summary> /// <typeparam name="T"></typeparam> internal class SampleFilter<T> : MessageHandlerFilter<T> { public override void Handle(T message, Action<T> next) { System.Diagnostics.Debug.WriteLine("subscribing..."); next(message); System.Diagnostics.Debug.WriteLine("subscribed."); } } } フォームを実装する Form1.cs using MessagePipe; namespace WindowsFormsApp1 { internal partial class Form1 : Form { #region ctor /// <summary> /// デフォルトコンストラクタ /// </summary> private Form1() { InitializeComponent(); } /// <summary> /// サービスプロバイダから呼び出されるコンストラクタ /// </summary> /// <param name="publisher">パブリッシャ</param> /// <param name="subscriber">サブスクライバ</param> /// <remarks> /// DIでフォームのインスタンスを生成した場合はこのコンストラクタが呼び出され、 /// publisher/subscriber にインスタンスが注入される。 /// コンストラクタのスコープは public でなくてはならない。 //// 型のスコープは public でなくてもよい。 /// </remarks> public Form1( IPublisher<string, SampleMassage> publisher , ISubscriber<string, SampleMassage> subscriber ) : this() { m_Publisher = publisher; m_Subscriber = subscriber; InitializePubSub(); } /// <summary> /// ServiceProviderを内包したコンテキストを受け取るコンストラクタ /// </summary> /// <param name="context">コンテキスト</param> /// <remarks> /// ServiceProviderを利用して publisher/subscriber のインスタンスを生成する。 /// </remarks> internal Form1(MyContext context) : this() { m_Context = context; m_Publisher = context.CreatePublisher<string, SampleMassage>(); m_Subscriber = context.CreateSubscriber<string, SampleMassage>(); InitializePubSub(); } #endregion /// <summary> /// Pub/Sub に関する初期処理 /// </summary> private void InitializePubSub() { // キーが "form1" であるメッセージを購読する m_Releaser = m_Subscriber?.Subscribe( "form1" , x => { System.Diagnostics.Debug.WriteLine($"subscribe: {x.Message}"); } ); } private readonly MyContext? m_Context; private readonly MessagePipe.IPublisher<string, SampleMassage>? m_Publisher; private readonly MessagePipe.ISubscriber<string, SampleMassage>? m_Subscriber; private IDisposable? m_Releaser; private void button1_Click(object sender, EventArgs e) { // メッセージを発行する // 前述のサブスクライバには一つめのメッセージのみが送られる m_Publisher?.Publish("form1" , new SampleMassage($"message to form1 at {DateTime.Now}") ); m_Publisher?.Publish("form2" , new SampleMassage($"message to form2 at {DateTime.Now}") ); } } } SampleMassage.cs namespace WindowsFormsApp1 { internal readonly struct SampleMassage { internal SampleMassage(string message) { Message = message; } public string Message { get; } } } 参考リンク
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity error CS0619】Standard Assetsをインポートしたときのエラーの解決方法

動画 エラーテキスト Assets\Standard Assets\Utility\SimpleActivatorMenu.cs(10,16): error CS0619: 'GUIText’ is obsolete: 'GUIText has been removed. Use UI.Text instead.’ ↓ 「GUIText は廃止されました」 GUITextは削除されました。代わりにUI.Textを使用してください。 日本語に訳すとこう書いています。 解決法 1.エラーで指定されたファイルを開く SimpleActivatorMenu.csを開く。 エラーコードをダブルクリックすると、目的のファイルを開いてくれます。 2.GUI.TextをTextに変更する。 SimpleActivatorMenu.cs内の public GUI.Text camSwitchButton; を public Text camSwitchButton; に変更。 3.UnityEngine.UIを追加する 同じくSimpleActivatorMenu.cs内に using UnityEngine.UI: の一行を追加する。 変更後のSimpleActivatorMenu.cs SimpleActivatorMenu.cs using System; using UnityEngine; using UnityEngine.UI; // 追加 namespace UnityStandardAssets.Utility { public class SimpleActivatorMenu : MonoBehaviour { // An incredibly simple menu which, when given references // to gameobjects in the scene public Text camSwitchButton; // GUIText -> Textに変更 public GameObject[] objects; private int m_CurrentActiveObject; private void OnEnable() { // active object starts from first in array m_CurrentActiveObject = 0; camSwitchButton.text = objects[m_CurrentActiveObject].name; } public void NextCamera() { int nextactiveobject = m_CurrentActiveObject + 1 >= objects.Length ? 0 : m_CurrentActiveObject + 1; for (int i = 0; i < objects.Length; i++) { objects[i].SetActive(i == nextactiveobject); } m_CurrentActiveObject = nextactiveobject; camSwitchButton.text = objects[m_CurrentActiveObject].name; } } } おわり 修正後はファイルを保存してUnityに戻るとエラーが治っているはずです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む