C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

C#インタラクティブを.NET Frameworkで

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■103386 / inTopicNo.1)  C#インタラクティブを.NET Frameworkで
  
□投稿者/ furu (232回)-(2024/10/17(Thu) 11:37:26)

分類:[C#] 

VS2022

C#インタラクティブでエラーになります。

Microsoft (R) Visual C# インタラクティブ コンパイラ バージョン 4.10.0-3.24324.8 ()
'CSharpInteractive.rsp' からコンテキストを読み込んでいます。
> Encoding.GetEncoding("shift_jis")
System.ArgumentException: 'shift_jis' is not a supported encoding name.

以前はエラーにならなかったと思うのですが
C#インタラクティブが.NET Frameworkでなく
.NET Coreで動くようになったからでしょうか?

もしそうなら
.NET Frameworkで動くようにする方法はありますか?
引用返信 編集キー/
■103389 / inTopicNo.2)  Re[1]: C#インタラクティブを.NET Frameworkで
□投稿者/ furu (234回)-(2024/10/17(Thu) 11:55:14)
動作が違うのでテストにも困っています。

"122".Remove(3)
  C#インタラクティブ
    "122"
  プログラム(.NET Framework)実行やイミディエイトウィンドウ
    例外
    

引用返信 編集キー/
■103390 / inTopicNo.3)  Re[2]: C#インタラクティブを.NET Frameworkで
□投稿者/ furu (235回)-(2024/10/17(Thu) 12:13:18)
とりあえず、shift_jisの問題は
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
を実行することで回避しました。

引用返信 編集キー/
■103391 / inTopicNo.4)  Re[1]: C#インタラクティブを.NET Frameworkで
□投稿者/ 魔界の仮面弁士 (3805回)-(2024/10/17(Thu) 12:19:23)
>>Encoding.GetEncoding("shift_jis")
> System.ArgumentException: 'shift_jis' is not a supported encoding name.

VS2019 の C# インタラクティブだと、Encoding.GetEncoding("shift_jis") で
DBCSCodePageEncoding (BodyName="iso-2022-jp", CodePage=932, EncodingName="日本語 (シフト JIS)") の
インスタンスが返されましたが、VS2022 だと駄目ですね。


利用可能なエンコードの一覧は
 Encoding.GetEncodings()
で確認できますので、VS2022 においては
 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)
 Encoding.GetEncodings().FirstOrDefault(x => x.DisplayName == "shift_jis")
までは行えたのですが、
 Encoding.GetEncoding("shift_jis")

 Encoding.GetEncodings().FirstOrDefault(x => x.DisplayName == "shift_jis").GetEncoding()
を実行すると
 System.NotSupportedException: Specified method is not supported.
になってしまいますね。何だろう…。
引用返信 編集キー/
■103392 / inTopicNo.5)  Re[1]: C#インタラクティブを.NET Frameworkで
□投稿者/ WebSurfer (2930回)-(2024/10/17(Thu) 12:41:36)
No103386 (furu さん) に返信

> C#インタラクティブが.NET Frameworkでなく
> .NET Coreで動くようになったからでしょうか?

そのようですね。.NET 8.0 のコンソールアプリでも同じ結果になりました。

using System.Text;

namespace ConsoleApp4
{
internal class Program
{
static void Main(string[] args)
{
var encode1 = Encoding.GetEncoding("utf-32");
Console.WriteLine(encode1.ToString());

var encode2 = Encoding.GetEncoding("shift_jis");
Console.WriteLine(encode2.ToString());
}
}
}

/* 結果
System.Text.UTF32Encoding
Unhandled exception. System.ArgumentException: 'shift_jis' is not a
supported encoding name. For information on defining a custom encoding,
see the documentation for the Encoding.RegisterProvider method. (Parameter 'name')
at System.Text.EncodingTable.InternalGetCodePageFromName(String name)
at System.Text.EncodingTable.GetCodePageFromName(String name)
at System.Text.Encoding.GetEncoding(String name)
at ConsoleApp4.Program.Main(String[] args) in C:\Users\surfe\Documents\Visual
Studio 2022\Net8App\ConsoleApp4\ConsoleApp4\Program.cs:line 12
*/

実は .NET 8.0 でダメと言うのは初めて知りました。

shift_jis だけでなく IBM437 (OEM アメリカ合衆国) とか ibm850 (西ヨーロッパ言語)
とかも同じ結果になります。

特定の OS に依存するものは .NET ではサポートされないということなのでしょうか。
もう少し調べてみます。

引用返信 編集キー/
■103393 / inTopicNo.6)  Re[1]: C#インタラクティブを.NET Frameworkで
□投稿者/ WebSurfer (2931回)-(2024/10/17(Thu) 12:54:03)
No103386 (furu さん) に返信

.NET で Encoding.GetEncoding("shift_jis") を使うには、Encoding.RegisterProvider メソッド
を使う必要がありました。

参考

Encoding.RegisterProvider(EncodingProvider) Method
https://learn.microsoft.com/ja-jp/dotnet/api/system.text.encoding.registerprovider?view=net-8.0

NetCore でSJISエンコードを扱う
https://qiita.com/sugasaki/items/0639ea9ca07f1ba7a9e0

実行結果

> void HelloWorld()
. {
. var encode1 = Encoding.GetEncoding("utf-32");
. Console.WriteLine(encode1.ToString());
.
. Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
.
. var encode2 = Encoding.GetEncoding("shift_jis");
. Console.WriteLine(encode2.ToString());
. }
> HelloWorld()
System.Text.UTF32Encoding
System.Text.DBCSCodePageEncoding
引用返信 編集キー/
■103394 / inTopicNo.7)  Re[2]: C#インタラクティブを.NET Frameworkで
□投稿者/ WebSurfer (2932回)-(2024/10/17(Thu) 13:00:48)
ご参考

.NET 8.0 のコンソールアプリ

using System.Text;

namespace ConsoleApp4
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var encode1 = Encoding.GetEncoding("utf-32");
            Console.WriteLine(encode1.ToString());

            Console.WriteLine("サポートしているすべてのエンコーディングを取得する");
            var eis = System.Text.Encoding.GetEncodings();
            foreach (System.Text.EncodingInfo ei in eis)
            {
                Console.WriteLine("{0}\t{1}\t{2}", ei.DisplayName, ei.CodePage, ei.Name);
            }

            Console.WriteLine("-----------------------------");

            System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

            var encode2 = Encoding.GetEncoding("shift_jis");
            Console.WriteLine(encode2.ToString());

            Console.WriteLine("サポートしているすべてのエンコーディングを取得する");
            eis = System.Text.Encoding.GetEncodings();
            foreach (System.Text.EncodingInfo ei in eis)
            {
                Console.WriteLine("{0}\t{1}\t{2}", ei.DisplayName, ei.CodePage, ei.Name);
            }
        }
    }
}

/* 結果
System.Text.UTF32Encoding
サポートしているすべてのエンコーディングを取得する
Unicode 1200    utf-16
Unicode (Big-Endian)    1201    utf-16BE
Unicode (UTF-32)        12000   utf-32
Unicode (UTF-32 Big-Endian)     12001   utf-32BE
US-ASCII        20127   us-ascii
Western European (ISO)  28591   iso-8859-1
Unicode (UTF-8) 65001   utf-8
-----------------------------
System.Text.DBCSCodePageEncoding
サポートしているすべてのエンコーディングを取得する
Japanese (Shift-JIS)    932     shift_jis
Portuguese (DOS)        860     IBM860
Icelandic (DOS) 861     ibm861
IBM EBCDIC (Cyrillic Russian)   20880   IBM880
Hebrew (DOS)    862     DOS-862
French Canadian (DOS)   863     IBM863
Chinese Simplified (GB2312)     936     gb2312
Arabic (864)    864     IBM864
Nordic (DOS)    865     IBM865
Cyrillic (DOS)  866     cp866
Cyrillic (KOI8-U)       21866   koi8-u
IBM EBCDIC (US-Canada)  37      IBM037
Greek, Modern (DOS)     869     ibm869
IBM EBCDIC (International)      500     IBM500
Icelandic (Mac) 10079   x-mac-icelandic
IBM EBCDIC (US-Canada-Euro)     1140    IBM01140
IBM EBCDIC (Germany-Euro)       1141    IBM01141
IBM EBCDIC (Denmark-Norway-Euro)        1142    IBM01142
IBM EBCDIC (Germany)    20273   IBM273
IBM EBCDIC (Finland-Sweden-Euro)        1143    IBM01143
IBM EBCDIC (Italy-Euro) 1144    IBM01144
IBM EBCDIC (Spain-Euro) 1145    IBM01145
Central European (Windows)      1250    windows-1250
IBM EBCDIC (UK-Euro)    1146    IBM01146
Cyrillic (Windows)      1251    windows-1251
IBM EBCDIC (France-Euro)        1147    IBM01147
Western European (Mac)  10000   macintosh
Western European (Windows)      1252    windows-1252
Arabic (DOS)    720     DOS-720
IBM EBCDIC (Denmark-Norway)     20277   IBM277
IBM EBCDIC (International-Euro) 1148    IBM01148
Japanese (Mac)  10001   x-mac-japanese
Greek (Windows) 1253    windows-1253
OEM United States       437     IBM437
IBM EBCDIC (Finland-Sweden)     20278   IBM278
IBM EBCDIC (Icelandic-Euro)     1149    IBM01149
Chinese Traditional (Mac)       10002   x-mac-chinesetrad
Turkish (Windows)       1254    windows-1254
Hebrew (Windows)        1255    windows-1255
Korean (Johab)  1361    Johab
Arabic (Windows)        1256    windows-1256
Arabic (Mac)    10004   x-mac-arabic
Baltic (Windows)        1257    windows-1257
Hebrew (Mac)    10005   x-mac-hebrew
Vietnamese (Windows)    1258    windows-1258
Greek (Mac)     10006   x-mac-greek
Cyrillic (Mac)  10007   x-mac-cyrillic
IBM Latin-1     20924   IBM00924
Central European (ISO)  28592   iso-8859-2
Latin 3 (ISO)   28593   iso-8859-3
Baltic (ISO)    28594   iso-8859-4
Cyrillic (ISO)  28595   iso-8859-5
Arabic (ISO)    28596   iso-8859-6
IBM EBCDIC (Multilingual Latin-2)       870     IBM870
Greek (ISO)     28597   iso-8859-7
Hebrew (ISO-Visual)     28598   iso-8859-8
Turkish (ISO)   28599   iso-8859-9
Turkish (Mac)   10081   x-mac-turkish
Croatian (Mac)  10082   x-mac-croatian
Thai (Windows)  874     windows-874
IBM EBCDIC (Greek Modern)       875     cp875
IBM EBCDIC (Arabic)     20420   IBM420
Korean  949     ks_c_5601-1987
IBM EBCDIC (Greek)      20423   IBM423
IBM EBCDIC (Hebrew)     20424   IBM424
IBM EBCDIC (Italy)      20280   IBM280
IBM Latin-1     1047    IBM01047
IBM EBCDIC (Spain)      20284   IBM284
IBM EBCDIC (UK) 20285   IBM285
Romanian (Mac)  10010   x-mac-romanian
Japanese (JIS 0208-1990 and 0212-1990)  20932   EUC-JP
Ukrainian (Mac) 10017   x-mac-ukrainian
Europa  29001   x-Europa
Greek (DOS)     737     ibm737
Western European (IA5)  20105   x-IA5
Chinese Traditional (Big5)      950     big5
Chinese Simplified (GB2312-80)  20936   x-cp20936
German (IA5)    20106   x-IA5-German
Swedish (IA5)   20107   x-IA5-Swedish
Norwegian (IA5) 20108   x-IA5-Norwegian
Cyrillic (KOI8-R)       20866   koi8-r
Baltic (DOS)    775     ibm775
Estonian (ISO)  28603   iso-8859-13
IBM EBCDIC (Japanese katakana)  20290   IBM290
Latin 9 (ISO)   28605   iso-8859-15
Chinese Traditional (CNS)       20000   x-Chinese-CNS
Arabic (ASMO 708)       708     ASMO-708
IBM EBCDIC (France)     20297   IBM297
Thai (Mac)      10021   x-mac-thai
TCA Taiwan      20001   x-cp20001
IBM EBCDIC (Turkish)    20905   IBM905
Chinese Traditional (Eten)      20002   x-Chinese-Eten
IBM EBCDIC (Korean Extended)    20833   x-ebcdic-koreanextended
IBM5550 Taiwan  20003   x-cp20003
TeleText Taiwan 20004   x-cp20004
Wang Taiwan     20005   x-cp20005
Western European (DOS)  850     ibm850
IBM EBCDIC (Thai)       20838   IBM-Thai
Central European (DOS)  852     ibm852
IBM EBCDIC (Icelandic)  20871   IBM871
Central European (Mac)  10029   x-mac-ce
OEM Cyrillic    855     IBM855
IBM EBCDIC (Cyrillic Serbian-Bulgarian) 21025   cp1025
Korean Wansung  20949   x-cp20949
Turkish (DOS)   857     ibm857
OEM Multilingual Latin I        858     IBM00858
T.61    20261   x-cp20261
IBM EBCDIC (Turkish Latin-5)    1026    IBM1026
ISO-6937        20269   x-cp20269
Unicode 1200    utf-16
Unicode (Big-Endian)    1201    utf-16BE
Unicode (UTF-32)        12000   utf-32
Unicode (UTF-32 Big-Endian)     12001   utf-32BE
US-ASCII        20127   us-ascii
Western European (ISO)  28591   iso-8859-1
Unicode (UTF-8) 65001   utf-8
*/

引用返信 編集キー/
■103395 / inTopicNo.8)  Re[2]: C#インタラクティブを.NET Frameworkで
□投稿者/ 魔界の仮面弁士 (3806回)-(2024/10/17(Thu) 13:30:59)
2024/10/17(Thu) 14:46:11 編集(投稿者)

No103389 (furu さん) に返信
> "122".Remove(3)
>   C#インタラクティブ
>     "122"
>   プログラム(.NET Framework)実行やイミディエイトウィンドウ
>     例外

どうやら .NET 6 の時点で仕様変更があったようです。

コンソールアプリで、<TargetFramework> を変更しながら
 System.Console.WriteLine("122".Remove(3));
を実行してみると、下記の結果になりました。

netcoreapp1.0 → インストールしていないため未検証
netcoreapp1.1 → インストールしていないため未検証
netcoreapp2.0 → System.ArgumentOutOfRangeException
netcoreapp2.1 → System.ArgumentOutOfRangeException
netcoreapp2.2 → System.ArgumentOutOfRangeException
netcoreapp3.0 → System.ArgumentOutOfRangeException
netcoreapp3.1 → System.ArgumentOutOfRangeException
net5.0 → System.ArgumentOutOfRangeException
net6.0 → "122"
net7.0 → "122"
net8.0 → "122"


下記を見る限りでは、.NET / .NET Framework 共に Exception を吐きそうだけれど…。
https://learn.microsoft.com/ja-jp/dotnet/api/system.string.remove?view=net-8.0

.NET Framework の実装では、str.Remove(str.Length) 時は
「if (startIndex >= Length)」によって例外になる。
https://referencesource.microsoft.com/#mscorlib/system/string.cs,2942
※.NET 5 の実装も、上記とほぼ同じ模様


しかし .NET 6 の実装では、ガード句の判定が
「if ((uint)startIndex > Length)」だけになっているため、
文字数と等しい場合は許容されてしまっている。
https://source.dot.net/#System.Private.CoreLib/src/libraries/System.Private.CoreLib/src/System/String.Manipulation.cs,1182
https://github.com/dotnet/runtime/blob/5535e31a712343a63f5d7d796cd874e563e5ac14/src/libraries/System.Private.CoreLib/src/System/String.Manipulation.cs#L1060C1-L1067C45
引用返信 編集キー/
■103397 / inTopicNo.9)  Re[1]: C#インタラクティブを.NET Frameworkで
□投稿者/ 魔界の仮面弁士 (3808回)-(2024/10/17(Thu) 17:03:06)
No103386 (furu さん) に返信
> もしそうなら
> .NET Frameworkで動くようにする方法はありますか?

手元の VS2022 では
 Environment.Version
を実行すると、[6.0.35] と返されました。

その後、
 #reset 64
もしくは
 #reset 32
を実行すると、Environment.Version が [4.0.30319.42000] に変化しました。

この状態では、
 "XYZ".Remove(3)
が ArgumentOutOfRangeException を吐くようになり、
 Encoding.GetEncoding("shift_jis")
も動作しています。


そして
 #reset core
のコマンドを実行した場合は最初の状態、すなわち
 "XYZ".Remove(3)
が(例外ではなく)"XYZ" を返す状態となり
 Encoding.GetEncoding("shift_jis")
が(DBCSCodePageEncoding ではなく)例外を返す状態に戻りました。
引用返信 編集キー/
■103408 / inTopicNo.10)  Re[2]: C#インタラクティブを.NET Frameworkで
□投稿者/ furu (236回)-(2024/10/19(Sat) 09:50:05)
No103393 (WebSurfer さん) に返信
> ■No103386 (furu さん) に返信
>
> .NET で Encoding.GetEncoding("shift_jis") を使うには、Encoding.RegisterProvider メソッド
> を使う必要がありました。

いろいろ調べていただきありがとうございます。
RegisterProviderの件はわかっていました。
No103390

引用返信 編集キー/
■103409 / inTopicNo.11)  Re[2]: C#インタラクティブを.NET Frameworkで
□投稿者/ furu (237回)-(2024/10/19(Sat) 10:17:08)
No103397 (魔界の仮面弁士 さん) に返信
> その後、
>  #reset 64
> もしくは
>  #reset 32
> を実行すると、Environment.Version が [4.0.30319.42000] に変化しました。
ありがとうございます。

プロジェクトのメソッドのテストで使用しているのですが
以下の順番で問題なく実行できました。

・#reset 64
・プロジェクトでインタラクティブを初期化
・テスト
・プロジェクトでインタラクティブを初期化
・テスト

CSharpInteractive.rspで
#reset 64
実行できるといいのですが無さそうですね。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ