ラベル C# の投稿を表示しています。 すべての投稿を表示
ラベル C# の投稿を表示しています。 すべての投稿を表示

【Windowsで解消済み】Could not execute because the application was not found or a compatible .NET SDK is not installed.

 Unity用にRoslynを入れようと、Windows機で下記パッケージをインストールしようとした

PS C:\Users\Main> dotnet add package ErrorProne.NET.CoreAnalyzers --version 0.1.2


が、いきなり以下エラーでインストールできない。

Could not execute because the application was not found or a compatible .NET SDK is not installed.


ひとまず .NET の導入状況を見てみる。

 PS C:\Users\Main> dotnet --info


なんだか色々入っている

 Host (useful for support):

  Version: 5.0.2

  Commit:  cb5f173b96


.NET SDKs installed:

  No SDKs were found.


.NET runtimes installed:

  Microsoft.AspNetCore.App 3.1.28 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]

以下、略。


が、ここで気になるワード

 .NET SDKs installed:

  No SDKs were found.


SDKが入っていない!

というわけで、「https://aka.ms/dotnet-download」から

「.NET Core 3.1」の「SDK」をDL&インストールして端末を再起動

再度、冒頭に書いたコマンドを打ったら無事通り解決した!

※過去にVisualStudioから入れたSDKと重複して入っていると認識しなかったので、一度.NET RuntimeとSDKをコントロールパネルからアンインストールしてから、必要なバージョンのSDKだけ単体で入れなおしたら認識も解消しました。



 

「C#」で「拡張メソッド」を作ろう

C#の拡張メソッドとは?

例えば、

"なにがし".IsNullOrEmpty()

で、引数の文字列が「nullまたは空」なら「true」を返すというメソッドがありますが、

都度、 「string.IsNullOrEmpty」 と記述されるのは長ったらしいので、

"なにがし".IsNullOrEmpty()  

といった書き方でも同様の処理ができるようにしたい時、拡張メソッドで実現可能です。

上記のように「既存の型」に対して、「新しい機能を追加」できる概念を「拡張メソッド」といいます。

実例

string a = "123";
string b = null;
Console.WriteLine( $"{a.IsNullOrEmpty()}/{b.IsNullOrEmpty()}" ); 
```shell > false/true

こんな感じで、文字列の後ろにメソッドを書く感じにします。

やりかた

基本的に 「public staticなクラス」 の中に

「public staticなメソッド」 を作って

「最初の引数の頭にthisというキーワードをつける」 だけでOKです。

実際に書いてみます。

public static class StringUtility
{
    public static bool IsNullOrEmpty( this string str )
    {
        return string.IsNullOrEmpty(str)
    }
}

これだけです。

追加した拡張メソッドを使って処理を書くと、以下のようになります。

Console.WriteLine( $"{"ABC".IsNullOrEmpty()} ); // false

string test = null;
Console.WriteLine( $"{test.IsNullOrEmpty()} ); // true

“ABC” も文字列リテラルのstring扱いなので、

(今回のメソッドでは、ほぼ無意味ですが)そのまま拡張メソッドを使用可能です。

まとめ

  • 適当な名前の「public static class」を追加
  • 「public static」なメソッドに「bool」を返してほしいので、戻り値に「bool」
  • 「最初の引数の頭にthis」というキーワードをつける
  • あとは、処理を書くだけ

こうする事で、「thisを付けた型」の変数の後ろに「ドット 拡張メソッド名」の形式で呼べるようになります。

ちなみに、「クラス名」「メソッド名」「thisの後ろの型」「thisの後ろの変数名」は任意に付けられますので、

必ず上記サンプルの名前でなくてはならないという事ではない点は、抑えておきましょう。

色々、応用が聞くので自分なりの拡張メソッドで開発を効率化しましょう!

Rider2020.1 のコンテキストメニューでフォーカスがひっかかる

JetBrains Rider 2020.1 のMacでのお話。

右クリでコンテキストメニューを開いたとき、
「リファクタリング」と「折りたたむ」にフォーカスが当たるとひっかかって
他のコンテキストメニューになかなかフォーカスが移ってくれない事がある。

自分としては、リファクタリングはShift+F6で名前変更するくらいだし、
折りたたむは使わんしコンテキストメニューにそもそもいらんのよねと思っていたので、
そもそも項目を削除できないか設定をあれこれ見ていたところ、以下で解決した。

Preferences>外観&振る舞い>Menus and Toolbars>エディタのポップアップメニューアクション>EditorPopupMenu1.FindRefactor
から「リファクタリング」と「折りたたむ」を[ - ]を押して削除すればOK。

C# で SJIS を UTF-8 にエンコードする方法

今回は Unity でテキスト(ShiftJIS)を読み込んだけど、UTF-8にしたかったというケースでの例
byte[] loadData;
   
using(FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read)){ 
 loadData = new byte[fileStream.Length];
 fileStream.Read(loadData , 0, loadData .Length);
}

Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");
string sjisstr = sjisEnc.GetString(loadData);
byte[] bytesData = System.Text.Encoding.UTF8.GetBytes(sjisstr);
Encoding utf8Enc = Encoding.GetEncoding("UTF-8");
string utf = utf8Enc.GetString(bytesData);

Debug.Log ("Test = " + utf);

error CS1010: Newline in constant

文字コードを変更して保存できるテキストエディタ( Terapad 等)で

文字コードを UTF-8 (BOMなし) にして保存すれば直る。

UTF-8N ではエラーが出たのでメモ。

なお、改行コードは関係ないようだ。

オブジェクト参照が必要です (CS0120) が出る原因

static 宣言されてないものにアクセスしようとしていると出る。

オブジェクトインスタンスを作成してからアクセスする。

Shader.Find のパラメータはファイル名ではない

Shader.Find("ShaderName");

の "ShaderName" 部分に指定するのは shader ファイルのファイル名ではなく、

shader コードの頭で定義している部分を指定する。

例)

A.shader
=============================================

Shader "YourShaderNameHere"
{

// ...

}

B.cs
=============================================

void Start () {

Shader shader;

shader = Shader.Find("A"); // Failed. shader == null
shader = Shader.Find("YourShaderNameHere"); // Success. shader != null

}

ArrayList から任意の配列へ変換する

string[] s = ( string[] ) ary.ToArray( typeof(string) );

といった具合に、ToArray の引数に typeof (変換したい型) とし

その結果を変換したい型の配列にキャストする。

using ディレクティブまたはアセンブリ参照が不足しています。の原因

調べると、拡張定義元と呼び出し元の .NET フレームワークのバージョン違いなどがあるようだが、

自分の場合は、拡張メソッドのクラスに public を付けていなかったのが原因だった。

他にも Unity の Assets > Open C# Project などで一度エディタとの同期をとってやると直る事があるので試してみる価値あり。

[追記]

自分のクラスでエラーが出ている時にビルドすると

NGUI など他のアセットで「using ディレクティブまたはアセンブリ参照が不足しています。」が出る事があるようだ。

自分のクラスのエラーを全て直してクリーン&ビルドすれば直った。