C#, C♯, C#相談室 Part96
レス数が1000を超えています。これ以上書き込みはできません。
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
■Visual Studio 2017 Community(無償の統合開発環境)等はこちら
http://www.visualstudio.com/downloads/
■コードを貼る場合はこちら
http://ideone.com/
■前スレ
C#, C♯, C#相談室 Part94
https://mevius.5ch.net/test/read.cgi/tech/1553075856/
■次スレは>>970が建てる事。
建てられない場合は他を指定する事。
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured ■関連スレ
初心者の質問向けはこちら
ふらっと C#,C♯,C#(初心者用) Part153
https://mevius.5ch.net/test/read.cgi/tech/1639403601/
■過去スレ
C#, C♯, C#相談室 Part90
http://echo.2ch.net/test/read.cgi/tech/1455160063/
C#, C♯, C#相談室 Part91
http://echo.2ch.net/test/read.cgi/tech/1467142749/
C#, C♯, C#相談室 Part91 (実質Part92)
http://echo.2ch.net/test/read.cgi/tech/1467211515/
C#, C♯, C#相談室 Part92 (実質Part93)
http://echo.2ch.net/test/read.cgi/tech/1485589613/
C#, C♯, C#相談室 Part93 (実質Part94)
http://mevius.5ch.net/test/read.cgi/tech/1492818720/
C#, C♯, C#相談室 Part94 (実質Part95)
https://mevius.5ch.net/test/read.cgi/tech/1553075856/ とりあえず落ちてたから立てた
なんかミスってたら訂正よろ たておつ
URLは変わってないけど今はVisual Studio 2022だな
あとふらっとのテンプレにある.NETの公開ソースのURLはあってもいいかも
■.NETのソースファイルはこちら
https://referencesource.microsoft.com/
https://source.dot.net/ .NET5 Windows Form のユーザーコントロールで、Panelの様にデザイナで
他のコントロールを貼り付けられるようにするにはどのようにすれば良いので
しょうか。 >>5
普通にデザイナーでポトペタ出来るけど?
vs2022 >>6
ユーザーコントロールを貼り付けるんじゃ無くて、ユーザーコントロールに貼り付けたいんだけど・・・
あと、ユーザーコントロールのデザイナでは無く、フォームのデザイナでね。 >>7
フォームに乗っかってるユーザコントロールの中に部品をポトペタしたいのか?
無理です! >>8
仕様的に不可能と言うことですね。
ちょっとやり方を変えてみます。
レスThxです。 >>5
Panelを継承してカスタムコントロールつくれば? C++のvectorは、値型だと突っこめる奴がいないレベルの低さに涙が出る 恥ずかしい誤爆だな。
初心者のくせにマウンティングしようとするからだぞ。 .netframework4.7+WinFormでフォームのActiveControlがTextBoxで
そのコントロールのValidatingイベントが実装されていたらValidatingイベントを呼び出す
ってのをやりたいんですがいい方法はないですか?
if ((this.ActiveControl is TextBox box) && !(box.Validating is null))
{
var args = new CancelEventArgs(false);
box.Validating(args);
}
こんな感じに書ければいいんですが「Validatingは+=、-=の左辺のみ使用できます」とエラーになってしまいます
リフレクション使って無理矢理OnValidatingを呼び出すしかないんですかね? Textbox派生クラス作ってOnValidating()呼び出したら? イベントの正体はマルチキャストデリゲートのはずだから
MulticastDelegate.GetInvocationList でいけんじゃね
つかコントロール参照とれてるなら普通にInvokeするだけで良い気がしてきた ところがどっこいeventのマルチキャストデリゲートはprivate扱いなので外から触れないのだ private をc# で突破するのは
system.reflectionをggrたまえ もちろん
DataGridのプライベートメンバーを
操作するサンプルとかが転がっている 正攻法は派生。次点でreflectionでprotected
それらで解決できる問題なのにreflectionでprivate触るのはただのバカだよ
privateは基本的に保証されないものだから突然使えなくなっても文句言えない マ板ならともかくム板の相談スレで悪質なネタ書くような奴にはなりたくないな どう見てもネタじゃないだろ。忘れてくださいってだけだよ
本気でネタだと思って書いてたなら単なる基地外。でもまあ5chには多いから本気でそう思ってたのかもしれないがw どう考えても20からの流れはネタだろぅ
なんか悪いもんでも喰ったのか?
トウダイツブは毒腺除去せずに売っている場合があるから気をつけろよ。 >>31
どうみても>>24からの流れはネタになってないんだが
ちゃんと流れ見えてるのか?ネタは外すと痛いぞ 実装可否ではなく俺の美学に反する奴は全て悪。
って主張そのものがネタだと思っていたんだがマジだったのか。
そういう主張はnoteかquiitaにでも書きたまえ いまいち何がしたいのか分からんが、Validatingの処理を別メソッドでやるようにしてEnterイベントでそのイベント実行すればいいんでないの
継承コントロール作れるなら継承した方がいいけど よくわからないが最近のC#は
private メンバーを派生クラスから
アクセス出来るようになったのかね?
19にはprivateと明記されているが
別の世界線の住人かな?w privateに格納されてるイベントを呼び出す処理が実装されてるんだよ
それがon〜系の関数でprotectedもしくはpublicになってる
今回はprotectedだから派生してやればそれを呼び出せるということ それは、19の時点で公開されている情報では無いな
只の後出しじゃんw >>16-17 を見てみろ。質問主もon〜を把握してるとこから始まってるんだよ・・・ 19で話の流れが変わった事に対して
別の回答を出した24に対して
いきりマウントした27がガイジという結論やな >>41
> 別の回答を出した24に対して
本人によるとネタらしいぞ
また恥の上塗りしちゃったねw 構造体の配列のメモリ確保で
データを入れる事は
できますか
A[] ={{1,2,2},{3,4,2},{1,5,6}}
みたいなノリの
お願いいたします A = new int[][] { new int[] { 1, 2, 2 }, new int[] { 3, 4, 2 }, new int[] { 1, 5, 6 } }; 多重配列とか勝手に用語作って質問するのは良くないよ。 コマンドプロンプトで起動するソフトで
コマンドプロンプトだと途中処理取得できるけど
C#上でリアルタイムで途中処理表示させるのって
スレッドを非同期にするやりかたとか考えた方がいいの? プロセスの標準出力を読むだけ
C#側がシングルスレッドでもリアルタイムに取得して表示できる >>49
グーグル先生は賢い「多重配列」で検索すると「多次元配列」が出てくる。間違える人が一定数居るんだな。
c#だと多次元配列じゃなくてコレクションを使うほうが多いが。 >>50
非同期にしなくても表示出来るが非同期の方がスマート C#を独学で勉強したいんですが何から手をつけたら良いでしょうか
言語はシェルやvbaはできます、Pythonもちょっとだけ なんでc#やりたくなったのか思い出してそのやりたかったことをどうやったらできるかぐぐってやればいい
とりあえずvsインストールしてさっさと始めろ
考えたり人に聞くよりもまずは手動かせ C#ってvisualstudioのインストールだけで出来るの?
PythonみたいにC#自体はインストール不要なん? vsのインストーラー起動したらc#をインストールするかどうかチェックするところがある
とりあえずやってみりゃ分かる なるほど、ありがとうございます
ちなみにやりたいと思った理由はなんとなくの思いつきです 最初に画面作る→コード作る
勝手にコード作るから書き換えるときリファクタリングでちゃんとなおさないと
ボタンとの連携が外れたりしてだるい C#EntityFrameworkでテーブルの有無をチェックする方法ってありますか?
今はDbSet<Entity>のFirst()で例外が出たら、で仮チェックしてます
SQL文で書けば良いと言われればそれまでですが、それとは別にLINQや
DbSet<Entity>.Where(x => x.~ = Id);
みたいな方法でチェックする事はできるのでしょうか? Dictionary<string, Func<T, TRESULT>>
みたいな事をやりたいのですが
どう書くのが正解でしょうか? 適当な関数宣言をもったinterface作って、それ派生のclassで実装して
dictionary<string, interfacename>? 適当だが書き方の話なら
どこかに書く
bool func(int n) { if (n <= 3) { return true; } else { return false; } }
var a = new Dictionary<string, Func<int, bool>>();
a.Add("test2", func);
bool b2_t1 = a["test2"](1);
bool b2_t3 = a["test2"](3);
bool b2_f5 = a["test2"](5);
ラムダ
a.Add("test1", x => { if (x == 1) { return true; } else { return false; } });
bool b_t1 = a["test1"](1);
bool b_f3 = a["test1"](3);
bool b_f5 = a["test1"](5);
Funcを加工するなら>>66のようにinterface、他オブジェクト型とか識別子渡して型チェックとか? >>64ありがとうございます
SELECT 〜 FROM 〜やOBJECT_IDのべた書きって事ですよね
それしかないんかな >>66,67
すみませんありがとうございます
Tが色々な型のFuncを登録したいのですがinterfaceの書き方がわかりません そもそもなぜテーブルがないとかいう状態になるのか
その設計を見直したほうが良いんじゃね あれだろ、ワークテーブルがもし存在したら消したりとか
年度でテーブルを分けたいとかわけわからんこと言われたりとか
そういう用途だろ >>69
実際どんなのが欲しいのか知らないけどこんな感じでいいんじゃないの?
interface aaa
{
TRESULT bbb<T, TRESULT>(T n);
}
class AAA : aaa
{
public TRESULT bbb<T, TRESULT>(T n)
{
throw new NotImplementedException();
}
} >>69
欲しいのは本当にinterfaceか?って疑問が出るが
ジェネリクスinterfaceの定義方法は(System.Collections.Generic.)IEnumerableの定義を見に行けばなんとなく分かるとは思う
あとinterfaceはinterfaceからしか継承できない
>>65の書き方だとジェネリクスclassになりそう Dictionary<string, Func<object, object>>ではだめなのか .net 6で、DataGridViewにDataSourceをバインドして表示する時、
データ量が多い(約24万レコード)と一時的に応答なしになります。
※データ取得は別スレッドで行っています。
サブフォームで表示しており、処理中はメインフォームも応答なしになりますが、
メインフォームとサブフォームを別スレッドにするみたいなのは無理ですか? VirtualMode=true
にする。その他もろもろ処理加える必要あるからぐぐれ >>76
>>77が言ってるように仮想モードを使うんだよ。グリッドで見えてる部分だけを読み込む。
サンプルコードがMSDNのサイトにあるから頑張って実装してくれ。 窓を閉じたときに
MethodInvokerの中の処理がまだ実行中で例外出すんだけど
停止させるか完了するまでフォームの廃棄を待つ方法は無いの? 一旦FormClosingでキャンセルしたあと完了してから改めてCloseする >>69
Genericだとコンパイル時点で型決定する必要があるから、色々な型に対応させたいとかなると
>>74が言ってるみたいにobjectにするか、dynamicにでもするしかない >>81
嘘教えんな
ジェネリクス定義側はFunc<T, TResult>みたいにコンパイルに型決まってないだろうが
Func<object, object> とかいうクソみたいな型を使わせようとするな dic.Add("a", (int a) => a * 2);
dic.Add("b", (string b) => b + b);
をやりたいって質問であるという想定なんでしょ? いろんな型のFuncを受け付けるようにするならそれ用のclassを作ってしまった方が手っ取り早い
public class MyDictinary<T, TResult> : Dictinary<string, Func<T, TResult>{...}
Funcをなんでも受け付けるようにするなら
public class MyDictinary<TDelegate> : Dictinary<string, Func<T, TResult> where TDelegate: Delegate {...}
どうしてもinterfaceにしなくちゃいけないなら
public interface IMyDictinary<T, TResult> : IDictinary<string, Func<T, TResult>{...}
ごちゃ混ぜのFuncを受け付けるようにするとFunc呼び出し時に大変な思いをするだけだからやらん方がいい ?
>>69はDictionaryいっこにいろんな引数型/戻り値のFuncを入れたいと言ってるみたいだから>>81しかないと思うんだけど・・・
引数型/戻り値型毎に別々のDictionaryにするだけなら、たとえば
var dic1 = new Dictionary<string,Func<int, string>>();
var dic2 = new Dictionary<string,Func<int, int>>();
var dic3 = new Dictionary<string,Func<string, string>>();
みたいにT/TResultの組み合わせに応じて別変数にするだけで解決するような・・?
なんでわざわざ>>85みたいなclassなりinterfaceなりを作る必要があるのかわからない >>85
それで違う型の引数のdelegateどうやって突っ込むつもりだ?
アホなのか マジで1つのインスタンスに別の型のdelegateが入ればなんでもいい前提なん?
取り出して呼び出すときに引数/返り値型調べないといけないが ていうか>>85ってコンパイル通る?
「>」ひとつ付け忘れとかDictionaryのミススペルはともかくとして、
2つめの書き方でT/TResultの型はどこから決まるんだろう?
それとも
public class MyDictinary<TDelegate> : Dictionary<string, TDelegate> where TDelegate: Delegate { }
を意図してるのだろうか
Func<object, object>をクソと言ってるからには引数1つの制約すらつかなくなるこんなクソ以下の書き方を意図してるとも思えないけど・・・ そもそも、そのDictionary使って何したいかまでは知らんから
それを言えば、もう少しマシな案なりが出てくるとは思うが >>90
携帯からやったから酷いミスしてるのは悪かった
T/TResultの型を決めないならって意図で書いてる
当然Func<object, object>と同じで使うときに酷い目に遭うが
Func<object, object> だと引数型がobjectを受け付けないといけない縛りができるから
「いろんな関数を受け付ける」という要件を満たせない
Delegateだとその縛りはなくなる
ラムダを受け付けられなくなるが 質問者は
1つのDictionaryの中に異なる型を混在させたいという話をしてるのか
1つのDictionaryの中は同じ型のみ入るが、型が異なる複数のDictionaryをジェネリックで統一して扱いたいという話をしてるのか
前者ならジェネリックを使うケースではなさそう 単純なインターフェース使う例だとこんなもんかな
受け取る結果の型が決まってるなら、dynamic使わんで済むけど
public interface IJob
{
dynamic Run();
}
public class SomeJob<T1, T2> : IJob
{
public T1 Param1 {get;}
public T2 Param2 {get;}
public SomeJob(T1 param1, T2 param2)
{
Param1 = param1;
Param2 = param2;
}
public dynamic Run() => (dynamic)Param1 + (dynamic)Param2;
}
public static void Main()
{
var dic = new Dictionary<string, IJob>()
{
{"a", new SomeJob<int, double>(2, 3.3) },
{"b", new SomeJob<float, double>(5.5f, 16.612340) },
};
Console.WriteLine(dic["a"].Run());
Console.WriteLine(dic["b"].Run());
} SomeJobをジェネリックにしたけど、別にIJobを実装したクラス個別に作っても構わない わざわざinterfaceを定義する意味がわからん
たぶん>>94はdynamic型にキャストしたデリゲートを直接呼び出せることを知らないんだろう さすがにそれは判るわw
>>69でinterfaceが判らんって書いてるからサンプルで出しただけ 別にインターフェイスを使いたいってわけじゃないだろ
var dic = new Dictionary<string, Delegate>();
Func<int, int> f1 = (i => i + 1);
Func<string, string> f2 = (s => s + "さん");
dic.Add("1", f1);
dic.Add("2", f2);
Console.WriteLine(dic["1"].DynamicInvoke(2));
Console.WriteLine(dic["2"].DynamicInvoke("名無し"));
これでいいんじゃないか >>98
なんかすげーなまじで
仕事で使ってるだけのわいには到底思いつかんわ
しかしこれなんか業務で使える場面あるん? >>99
本当は何がやりたいかは知らんわ
>Dictionary<string, Func<T, TRESULT>>
>みたいな事をやりたいのですが
って話だからな 本当にやりたいことを突き詰めるとそんな面倒なことをしなくてもよい解決方法があったりするのはよくある事よな
今回の件でも当てはまるかどうかは知らんけど 例えばFFMPEGをC#で起動させてるときに
エンコード処理みたいな定期的に値が返ってくるやつって
別スレッドでFFMPEGを走らせて
本スレッドではテキストボックスあたりに出力するようにしたいんだけど
これってFFMPEGの処理が終わるまでメインスレッドはwaitしないとダメってことですよね?
単独スレッドで終了した結果は表示できるんですけど そんなことはない
別スレッドで読みだした値をメインスレッドに送って、メインスレッドでその値を表示すればいい
別スレッドからUIに表示しようとしたらエラーになる >>102
本スレッドのTextBox.TextにInvoke使って書き込むんだよ たぶんGUIアプリ作ってるんだろうけど
GUIのデータはメインスレッドしか書き換えちゃダメなルールがある
TextBox.Invokeでメインスレッドに自分のデータ変えてくれってお願いするか、
WPFのBindingならメインスレッドがデータ持ってないからデータ取りに来いってできたりする 今のc#はスレッドを安易に使えるがスレッドには深い闇がある。 c#ってvisual studio でテストする時って
アプリの前回値みたいの記憶できないの?
〇〇フォルダのパスとか記憶したいんだけど Windows上だと何日動かしてもメモリ使用量40MBくらいで安定してるプログラムが
(VS2002の診断ツールで確認)
ラズパイのMono上だと徐々にメモリ使用量が増え続けて
1日くらいで4GB到達して落ちるんだけど何故だろう タイマーかなんか仕掛けて手動で↓を呼ぶ
GC.Collect(2, GCCollectionMode.Forced, false, true);
それで減らないならMonoのランタイムがそもそもUNCOと思われ。
Unity Profilerで表示されるMonoで使用メモリ量が膨大になってしまう
https://teratail.com/questions/238133 dataGridView の中のリストの大きさってどうやって変えるの?
枠の大きさは変えられるんだけど
中のリストだけ小さいままでこまってる 中のリストという意味がちょっと判らない、列や行の幅の事?
名前にWidthとかHeightが含まれるプロパティ片っ端から弄ってみたら var form = new Form(){
Text = "たいとる"
FormBorderStyle = FormBorderStyle.FixedDialog
};
みたいに書けるやつ
一見VBのwith文っぽいけどプロパティの代入行為しかできなくて中途半端 そら、初期化のために用意されているものなんだからそういうもんだろ オブジェクト初期化子って名前を知らないとwith的なもんかと思ってしまうのかも知れないね vb.netのオブジェクト初期化子はWithなんだよね。
冗長だ。 c#のは同じような書き方でも意味が変わって一貫性のようなものがない(ように一見思える)
var form = new Form()
{Text = Text};
form.click += delegate
{Text=Text;};
vbのは普通の命令としてもwithがあり、そこに囲まれてる変数の頭にピリオドを付けるという書き方の一貫性のようなものがあるからな
どっちが初心者に優しいかと言えば今でもvbと感じる(vbがいいとは言ってない) フレームワークの話でしょうが、フォームアプリでモーダルフォームの外を
クリックした時に、モーダルフォームを閉じる事って出来るでしょうか?
スマホのUIによくある挙動ですが、同等の動きを実現出来ないかなと。 薄毛や抜け毛にお悩みなら、発毛専門の*****へ。
一人ひとりの薄毛・脱毛原因を正確に突き止め、その原因を解消する独自の発毛システムを提供しています。 たぶん画面全体に、透明のレイヤーでも貼るのだろう
それで、そのレイヤーがクリックイベントを受け取れる すいません 教えてください
文字列変数の中に 変数をしてしておいて 実行時に指定する方法ありますか?
例:
目覚まし時計プログラムで
9:00の時
9:00になりました。 おはようございます。
12時の時
お昼です 12:00になりました。
って 入れ替えたいのだけど
$Time になりました。おはようございます。
12時の時の文字列は
お昼になりました$Timeになりました。
って指定しておき $Timeをあとから指定したいみたいな方法です。 Replace("$Time", "12:00") >>123
お望みなのは、文字列補間?
string a="かきくけこ";
Console.WrightLine($"あいうえお { a } さしすせそ"); 埋め込む文章も変えたいみたいだから
DateTimeによって適したフォーマット用文字列を返すようにして、その後string.Format()するとか >>119
Deactivateイベントで拾えないか? >>126 ありがとうございます。
一つ進化しました。
求めているのは、 126みたいな感じです。 Ruby on Rails では、ERB(Embedded Ruby)で、何の文書にも、Rubyのコード片を埋め込める
例えば、a.rb 内で、ary = [ "a", "b" ]
と定義して、ERB のresult( binding )で、
この文脈を他のファイルへ、バインドできる
b.html.erb 内で、<% 〜 %>, <%= 〜 %> を使って、Rubyのコード片を埋め込む
<% ary.each do | elem | %>
<p><%=h elem %></p>
<% end %>
出力ファイル、b.html
<p>a</p>
<p>b</p>
他にも、カスタムフォーマットを自作して、その形式を日本語辞書に登録して、呼び出せる
ja:
time:
formats:
medium: "%Y年%m月%d日 (%a) %H:%M"
と定義したら、b.html.erb 内で、
<%=l( Time.current, format: :medium ) %>
と書くと、
出力ファイル、b.html
2022年02月25日 (金) 13:55
まあ、コミュニティーが配布している日本語辞書に、
最初から、幾つかの形式が登録されているから、自作する事は少ない Rubyって使ったことなかったけど、
それAsp.netにそっくりやね Console.writeline()はスレッドセーフでないというのは本当でしょうか?
今までシングルスレッドで動いていたプログラムを一部の処理だけマルチスレッドで動作するように変更中です
Console.writeline()の呼び出し箇所を全て変更する必要がありますか? 相談させてください。
IntPtr を ref int に変換するために以下のようなコードを書くと、期待通り False と表示されます。
IntPtr ptr = Marshal.AllocCoTaskMem(4);
ref int x = ref Unsafe.AddByteOffset(ref Unsafe.NullRef<int>(), ptr);
Console.WriteLine(Unsafe.IsNullRef(ref x)); // False と表示される
Marshal.FreeCoTaskMem(ptr);
しかし、以下のように意味のない for 文を追加すると、コードの最適化が有効な場合のみ True と表示されます。
for (int i = 0; i < 0; i++) { } // 意味のない for 文
IntPtr ptr = Marshal.AllocCoTaskMem(4);
ref int x = ref Unsafe.AddByteOffset(ref Unsafe.NullRef<int>(), ptr);
Console.WriteLine(Unsafe.IsNullRef(ref x)); // 最適化が有効な場合のみ True と表示される
Marshal.FreeCoTaskMem(ptr);
ただし、意味のない for 文があっても
Unsafe.AddByteOffset(ref Unsafe.NullRef<int>(), ptr)
→ Unsafe.SubtractByteOffset(ref Unsafe.NullRef<int>(), -(nint)ptr)
のように書き換えると常に False と表示されるようになります。
なぜこのようなことが起こるのかさっぱり見当がつかないので、お知恵を拝借できないでしょうか。
私の環境を分かる範囲で書くと以下のとおりですが、他に何か必要な情報があればお教えください。
Windows 10 Pro (21H2)
Microsoft Visual Studio Community 2022 (64 ビット) Version 17.1.1
コンソール アプリケーション、.NET 6.0
どうぞよろしくお願いいたします。 一行目しか見てないけど、これはいいのか?(8)かもよ
IntPtr ptr = Marshal.AllocCoTaskMem(4); そもそも現在のポインタ値がヌル参照からのオフセットだって保証されてるのか? 最適化でなんか情報が消し飛んでるんだと思うけど、判らんな
[MethodImpl(MethodImplOptions.NoInlining)]
public static ref T AddByteOffset<T>(ref T reference, IntPtr offset)
=> ref Unsafe.AddByteOffset(ref reference, offset);
とかやってインライン展開抑制してみたら >>137
JIT最適化を抑制せずF11でデバッグして逆アセンブルすると
先にConsole.WriteLine(Boolean)がTrue固定で呼び出されて
その後にMarshal.IsNullOrWin32Atom(IntPtr)となってるね
未定義動作はタイムトラベルを…彷彿とさせるがC#なんだよなぁ
MSIL的にも&とnative intの結果型は&に定められている筈だし
とはいえ、管理下ポインタはnullになりえないとか有った気もするし
null参照への演算が未定義なら道理なのかもしれない、あるいはバグか 皆様、返信どうもありがとうございます。
いただいたアドバイスを元に色々と確認をしていて反応が遅くなってしまいました。
申し訳ありません。
>>138
確認してみた所、C# では int は 32 ビットと決められているようです。
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/integral-numeric-types
ただ、可読性を考えると 4 ではなく sizeof(int) と書くべきでした。
ご指摘どうもありがとうございました。
>>139
Unsafe.NullRef<T>() と Marshal.ReadInt32(int) の実装を確認してみたところ、
おそらくその点は問題ないかと思います。
https://github.com/dotnet/corert/blob/master/src/System.Private.CoreLib/shared/Internal/Runtime/CompilerServices/Unsafe.cs
https://github.com/dotnet/corert/blob/master/src/System.Private.CoreLib/shared/System/Runtime/InteropServices/Marshal.cs
しかし、問題の原因は大抵こういう思い込みに隠れているものだと思うので、
可能性を一つ潰すことができてとても助かりました。
>>140
そうなんですよね。
for (int i = 0; i < 0; i++) {} は i++ に到達しないのは明らかだから
最適化でまるっと消えてしまうかと思っていたので、この結果には驚きました。
>>141
書いていただいたコードを試してみたところ、確かに最適化が有効でも期待通りの動作になりました。
それからもう一つ、書いていただいたコードを使わない場合、
プラットフォームが x86 と x64 の両方とも最適化有効時には期待通りの動作をしないことが分かりました。
(x86 の場合は常に期待通りに動作するならば問題の原因について一つ仮説が立てられるかと思ったのですが、
実際は違っていたので未だに原因はさっぱり見当がついていません…) >>142
null参照への演算が未定義というのは、AddByteOffset メソッド内の話でしょうか。
下記のページの AddByteOffset<T>(ref T, IntPtr) のところをみると
ldarg.0
ldarg.1
add
ret
とコメントされていて、少なくとも IL 的には一つ目の引数が null でも特に問題はないように思えてしまいます。
IL 的に問題がないかどうかは私は自信がないのですが、
もし IL に問題がないのに JIT 最適化で問題が起きてしまうとすれば、
バグと考えてもよいのでしょうか。
参考
https://github.com/dotnet/corert/blob/master/src/System.Private.CoreLib/shared/Internal/Runtime/CompilerServices/Unsafe.cs issue検索して無かったら、一応報告しといたほうがいいかもしらんね [Intrinsic]
がついてるメソッドは、Release時に特殊な最適化が走ってる筈なんだけど
それが誤動作するケースがあるのかもしらん(あくまで想像) あー同じような判定コードを読み間違えた
タイムトラベルは起きてないけど、代入もヌル判定もなくなってる感じかな
>>144
そう、片方が0なら実質意味はないから加算命令が現れなくても不思議ではないけど
Console.WriteLine(x);としてみても固定アドレス0をデリファレンスするので
xが常にぬるぽ扱いになってしまっている様ではある
C#的には未定義なら未定義でビルド時か実行時にエラーを出しそうだけど
Unsafeでチェックされないのか判断に困る。さもなければ最適化のバグだと思う winforms
dbの値は、dataset . datatable以外で、どうやって取得するの? list? >>145
そうですね。アドバイスありがとうございます。
私はこれまでこの手の問題は「まずは自分を疑え」と教わってきて
実際それで大抵の問題は解決してきたのですが、
皆様のお話をうかがうに、今回は自分の勘違いではなく
よそに原因があると考えたほうがいいのかもしれません。
これまで報告等は経験がないのですが、
それも視野に入れて調べてみたいと思います。
>>146
勉強になります。
その特殊な最適化で結果が変わることがバグなのか
私の力では判断が難しそうなのが歯がゆいところです。
>>147
> そう、片方が0なら実質意味はないから加算命令が現れなくても不思議ではないけど
> Console.WriteLine(x);としてみても固定アドレス0をデリファレンスするので
私の理解不足で、
「片方が0なら実質意味はない」 ← 0 + p の計算は必要ない?そりゃそうだ!
「固定アドレス0をデリファレンスする」 ← 0 + p = 0 ということ?p ではなくて?
という感想を持ってしまいました。
申し訳ないのですが、もしよろしければもう少し詳しく説明していただけないでしょうか。
> C#的には未定義なら未定義でビルド時か実行時にエラーを出しそうだけど
> Unsafeでチェックされないのか判断に困る。さもなければ最適化のバグだと思う
ご意見どうもありがとうございます。とても共感させていただきました。
未定義であればこそデバッグ時に教えてほしいものですが、
実際にはデバッグ時には期待通りに動作してしまうのが厄介なところです。 >>148
DataReaderで読むとか、EntityFrameworkやDapperみたいなフレームワーク使うとか そもそも値型にたいするヌル参照が未定義な気がするが
最適化で数値ゼロとヌル参照が同一視されてるとか? >>149
件の部分はJITコンパイルされたマシンコードの話で、ref intを参照する際に
xからでなくても「mov ecx, dword ptr [ptr]」的であっても整合性は取れるが
逆アセが「mov ecx, dword ptr [0]」になるので、xはnullにされてるという話
それならばIsNullRefが消えるのは順当としても、xがnullになる代入の欠落が
NullRef<int>が宜しくないのか、それをAddByteOffsetに与えるのがダメなのか
単なるバグか…、Unsafe.AsRefに直接IntPtr渡せれば/unsafeとせず済むのにね >>151
なるほど…。
ただ、Unsafe.IsNullRef(ref Unsafe.NullRef<int>()) と書けてこれが true を返すので、
値型に対するヌル参照が定められていない場合は Unsafe.NullRef<T> の T に int が
指定できること自体がバグということになってしまうような気もします。
一応未定義ではないけど、CLR 外部との相互利用等で必要に迫られない限り
使ってくれるなという感じなのでしょうか。
>>152
ご親切に説明していただきどうもありがとうございます。
逆アセンブルの結果に “なぜだか理由は分からないが” 0 になっている部分があって、
そこから x が null にされているというという事実が読み取れる、ということですね。
(まだ間違っていたら大変申し訳ありません)
> NullRef<int>が宜しくないのか、それをAddByteOffsetに与えるのがダメなのか
NullRef<T> と AddByteOffset<T> のソースコードのコメントにはそれぞれ
ldc.i4.0
conv.u
ret
ldarg.0
ldarg.1
add
ret
とあって、これを見る限り、NullRef<int>() を AddByteOffset<int> に与えることの問題は
私には読み取れませんでした。
(そもそもこの問題で IL を持ち出すこと自体が見当外れなのでしょうか)
もちろん、実際には特殊な JIT 最適化が行われているのでしょうが、
その結果 IL から期待される動作と変わってしまうようなら、
やはりバグとして報告したほうがよいのかなというのが今のところの考えです。 >>152
> Unsafe.AsRefに直接IntPtr渡せれば/unsafeとせず済むのにね
そうなんです!というか、本来私がしたいことからいうと
MemoryMarshal.CreateSpan<int> メソッドに IntPtr 型を渡せると一番よいのですが、
それができないのでこのメソッドが受け付けてくれる ref int を作るという方向で考えています。 >>153-154
仰る通りです
ECMA-335の文言"Managed pointers cannot be null"で検索してみたら案の定ツッコミありましたが
https://github.com/dotnet/runtime/issues/41418#issuecomment-681177889
これを受けてか、トップのNullRef<T>()に関する注釈にも
(10) Per ECMA-335, Sec. II.14.4.2, it is not strictly legal for a gcref to point to null.
However, all .NET runtimes allow this and treat it in a type-safe fashion,
including guarding accesses to null gcrefs by throwing NullReferenceException as appropriate.
と書かれていて問題なさそうな見解です
仕様に準拠していないというのは…JITコンパイラ的にどうなのか
言及を忘れていましたが、アセンブリにコード欠落は見受けられないのでC#コンパイラの問題ではないし
AddByteOffset<T>(ref T, IntPtr)にしても関連する注釈は
(1) Arithmetic operations on gcrefs (such as via Unsafe.Add) are not checked for correctness by the runtime.
The resulting gcref may point to invalid memory or to a different object. See ECMA-335, Sec. III.1.5.
のみですし、また前項と合わせてECMA-335が示されていますから、ILと無関係でもないでしょう
System.Runtime.CompilerServices.Unsafe.dllをデコンパイルしてみてもコメントと同じコードが示されます
Framework時代ならSafeBuffer継承とかやってましたが(SafeMemoryMappedViewHandleはコンストラクタがinternalなので)
これもこれで今見たら「SafeBuffer may be unavailable in future releases.」で笑えぬ 最近の標準ライブラリの実装を見るに、.NET開発チームはIntPtrを使わせたくないように感じる
ポインタ弄るなら、あぶねー事やってんだから明確にunsafe宣言しろって事なんだろうな すみません。規制にあってしまったのか、パソコンから書き込めなくなってしまいました。
この文章も書き込めるかどうか分かりませんが、
ひとまず、親切にしてくださった皆様に心からお礼申し上げます。 >>157 のリンク先の、
> Sergio0694 commented on 13 Nov 2021
> Having fake "safe" code using APIs like this instead of properly using built-in unsafe syntax is objectively worse and should be avoided. It makes it harder to see when code is actually doing unsafe things. It effectively makes your code more unsafe. It's an ongoing problem that has been here forever, certainly not helped by the existence of some APIs (looking at you Marshal...).
このコメントに激しく同意するわ。
ポインタ操作やってるのに、Unsafeクラスで無理矢理unsafeブロック書くの回避したところで、
それは危険なコードである事に変わりはない。 vs2022 c# winforms .net6
画面作って、vs再起動すると
フォームが読込エラーが発生する
おまえら、発生しないの? >>160
タブオーダーの変更も無効化されててマジゴミ .NET framework 4.8は永遠に不滅です( ー`дー´)キリッ WindowsFormでやるなら、実際.NET framework安定だと思う
.NET5とか6でやるなら、他のUI選択した方がいい 初心者ですまんが、async/awaitでtaskの実行とtask自体の生成の責務が分離されてない気がするんだが
asyncの中にはawaitがあるもの(ないと警告)という連鎖はどこで切ればいいの?
最終的にインフラまで行ったとしてそこのasyncメソッドはawaitするものがなくなってしまうよな?
末端は警告を無視するか、Task.Runとかを作ってTaskを返すかなりしろってこと? await hogesync();
↓
_= hogesync();
これで警告連鎖から逃げれる >>166
いやそっちじゃなくCS1998の方
↓みたいなの
async Task hogeA {await hogeB();}
// 警告 CS1998
async Task hogeB{Console.WriteLine("hogeB");} asyncにする必要がないのはしなければいいだけ
async Task hogeB{Console.WriteLine("hogeB");}
↓
void hogeB(){}
asincじゃないけど、hogeB();って呼び出せばawait hogeB();と意味は変わらない >>165
TaskCompletionSouece あと、インターフェースの都合でasyncだけど実装は非同期である必要がない場合には、Task.FromResultやValueTaskやCompletedTaskを使うとよい >>168-170
サンクス
中身が同期やけど呼び出し元はそいつを非同期で待機したけりゃTask.Runとか使うしかないって事だよな
asyncの中身を同期だけにすると混乱を招きかねないけどawait可能なTaskを自動で作ってくれてスレッド復帰なんかも勝手にやってくれる分利点もありそうな気がするんだが
どうなんだろ
asyncじゃないTaskを返すメソッドを作る法がええんかも知れんけどめんどいよね 違うんじゃね?
ある関数の内部処理で
状況によって同期の場合と非同期の場合に
スィッチする事は良くある ご存知の方いらっしゃいましたら教えてください
StreamReader urlReader = new StreamReader(urlStream, Encoding.UTF8);
string urlReadString = urlReader.ReadLine();
上記の関数使ってcharset=UTF-8が設定されてるURLを読み込んだときに
普通にテキストとして読み込めるときと、UTF-8の読み込みに失敗してEF BF BDが出力されるときがあるけど、
失敗するときって何か初期設定が足りてない?
それともReadLine()じゃなくて別の関数を使う? エンコーディング関係は、まず生バイトコードを確認しなさい バイトコードでなくバイナリデータな
バイナリモードでファイル開いて読み込んで16進出力するか、
BZとかのバイナリエディタでファイルのバイナリを見るのがいい URL言うとるやん
UTF8EncodingクラスでBOMの有無指定出来るけど、結局バイトコード確認しないと判定出来ん バイナリであってるだろ。むしろバイトコードって使いかた初めて聞いたぞ
urlならその内容をファイルに落として開いて確認するのが楽
それが面倒な場合はコードからstreamをファイルに落として確認 ファイル落とさんでもVSで配列取得すればデバッグで確認できるやろ streamはデバッガで直接中身見れない(よな?)のと
(俺が使ってる外部バイナリエディタは)エンコーディング自動判別してくれるから俺にとってはファイルの方が楽
ほかの人にとってはわからないな EF BB BFってUTF-8のBOMだよね
detectEncodingFromByteOrderMarksの指定がある
詳しくはEncoding.GetPreambleで調べる >>181
指定だけで自動判定出来るなら、そっちの方が楽そうね ソースジェネレーターってnetstandard2.0だからWinFormsは参照不可能?
ソースジェネレーター側で参照できずともまあ良いんだけど、出来ればWinFormsのいくつかのクラスからコンパイル時リフレクションで色々取り出したいのだが C#からPowserShellを実行して
登録済みのVPN一覧を取得しようとしています。
コマンド発行までは出来たのですが戻り値
Name ServerAddress の取得が出来ません。
どの様なコードを書けばよいでしょうか?
using (var invoker = new RunspaceInvoke())
{
var result = invoker.Invoke(source);
}
resultに値が入るハズなのですが・・・分かりません。
PowerShell上で実行するとVPN一覧が表示されています。 >>186
resultの中身をデバッガーで見てみなよ >>189
動的ビューというところに値がありました。
new Microsoft.CSharp.RuntimeBinder.DynamicMetaObjectProviderDebugView(result[0]).Items[24]
result[0]
BaseObject
ImmediateBaseObject
Members
Methods
Properties
TypeNames
本来であれば、この中のどこかに入ると思うのですが見つかりません。 内部クラスから外のprivateなenumの型を直接参照できるのはどうしてでしょうか?
public class A {
private enum ZZZ {a, b, c}
class B {
Console.Writeline("number = " + (int)ZZZ.a); // なぜenumだけこれが許されるのか
}} よろしければそのルールについて学べるようなヒントとかキーワードを教えて頂けると助かります。 ありがとうございます。enumが暗黙的にstaticなら都合がいいのでそういう事にします 派生クラスとInnerクラスをごっちゃにするなよ?
外側のクラスのインスタンスさえ得られればprivateにアクセスし放題だったり xxxx.exeで
var args = Environment.GetCommandLineArgs()
のargs[0]が xxxx.dll だった・・・ 関数のエラーを表現するのってどういうのが一番C#のスタイルに合うんでしょうか
例えば公式のtryparseなんてbool返しますよね。でも例外投げるって手もありますよね。なんか職場の古いおっさんははるか昔のCのやり方そのまま0とか-1とか返してるし メソッド次第、エラー次第 これ一つでオールオッケーなんて物はない
って当たり前の答えにしかならないよ 普通はboolでいいよ
処理中断したいよってな想定外の失敗は例外 >>203
> なんか職場の古いおっさんははるか昔のCのやり方そのまま0とか-1とか返してるし
Cでも定数か列挙体定義しろよってレベルだけどな >>203
> 例えば公式のtryparseなんてbool返しますよね。でも例外投げるって手もありますよね。
だからTryParseとParseの両方あるでしょ
汎用性を求めるなら両方用意すればいいし特定の場合だけなら使いやすい方を用意すればいいと思うよ 「エラー」を表すなら例外一択
そうするとtryブロック内に書かれている処理は正常系だけ、catchブロック内が異常系だけになって
ソースコードが明瞭になるし異常系ロジックをcatchの1か所に集約できる
こういう書き方に慣れるといちいち1処理行うごとに戻り値if分岐してるような書き方のダサさが分かる
例外が重いってのもたしかにその通りなんだけどまあ1回こっきり投げるだけなら許容範囲かな >>203
C流儀のintは成功が0だからboolと混在させると厄介なんだよな。 >>210
それshellのリターンコードと勘違いしてないか?
正常/異常を返すケースで正常が0って滅多にないと思うけど やっぱboolってintみたいな構造体より重いんか? エラーの内容を精査する必要があるなら、エラーコードなりを持たせた例外スローするけど
単純な失敗成功だけ見たいならbool返すかな >>211
C/CPPのライブラリは0が成功って割と多い
多分210が言いたいのはCにはbool型なんて無くてintをBOOLとして扱ってるからC的には0x100000はTRUE、C#的にはbyte化されて0となりfalseになるから注意ってことを言いたいんだと思うが >>213
別に重くない
例えば関数の戻り値でtrue表現するためのアセンブラは
intだとmov eax, 1
boolだとmov al, 1
アセンブリコードの使用バイト数的には同じか後者の方が小さかったはず >>220
ありがとう。delegateにPredicateってあるからその用途でfuncだと重いのかと思ってた >>212
例えばasctime_s()とかはerror_tを返すから正常/異常(だけ)を返すわけじゃないでしょ?
0で正常って言うのは多分fclose()とかの0とEOFを返すやつぐらいかと思うよ >>222
確かに.NET純正だとどうだろうな
少なくともUnityのil2cpp化されたものだとmov al, 1やtest al, alだが.NETもこれ以外の手法獲る必要性があるとは思えないが >>224
最終的にはマシン語になるわけだから同じでしょ。 >>221
デリゲート呼び出しはそれ自体がまあまあ重いぞ
少なくとも条件分岐にboolとintどっちを使用するかなどという微々たる差を全く無視できる程度にはな
そしてデリゲート呼び出しも普通はIOに比べたら誤差だから全く無視してよい 簡易的に確認したいなら、
https://sharplab.io/
でResultにJIT Asm選べばアセンブリコード見れるぞ
単純な型なら、Release選ぶと殆ど元の型や関数呼び出し残らないのが確認出来る >>225
どういうマシン語を生成するかはコンパイラの自由だから同じになるかは分からない
まあ結果ある程度同じにはなるはずだが C#/MVVMでお絵かきソフトのようなことをやる必要があります。ドラッグして長方形を書いたり、それを選択して移動したりみたいな。多分inkcanvasとか使うんですかね?
それで色々と調べているのですが、コードビハインドから除外するというのがどうも難しくて何がなんだかわかりません。ビヘイビアだのコマンドだのどうやって実装したものか途方に暮れています
以前formsで同じようなものを作ってそのときは普通に実装出来たのでコードビハインドさえ使っていいなら普通に行けるだろうにという状況です
MVVMでviewのビハインドからコードを除外するというのはもう絶対に守るべきものなのでしょうか >>229
UIコントロールの開発者は
はなからMVVMなぞ使っとらんよ >>229
WPF自体がもはやほとんど使われていないため、主流と呼べるような開発手法などは存在しない
自由に使えば良い MVVM原理主義から見たらかなりインチキ臭いServiceってやり方で、MやVMからControlにアクセスするやり方が一般的かな
Canvasのプロパティーを持って、そこにアクセスするためのメソッドやプロパティーが入ったServiceクラスを作って、それを例えばVMのプロパティーにする
で、Viewが初期化された時にそのクラスを生成してプロパティーのCanvasに実態を設定する
そのクラスをVMの該当プロパティーにインジェクションする
わかりにくいだろうが、どっかに上手いこと書いてある解説でも探してくれ 普段c++でUIコントロール作ってるような開発者が
c#版作るからってわざわざMVVMなんか使うわけないでしょーーが 普段WinFormとかでUI作ってる人に聞きたいんだけど
値の変化をリアルタイムでUIに反映する場合ってどうやってんの?
値が変化する箇所全てに画面の更新処理入れる感じ? >>236
うちの場合は画面にUpdate()なりをつくって、そのメソッド内に基本的に全部のコントロールの更新処理を書いて、必要な時に呼び出してる。
DataGridViewなど必要な時にしか更新しないものは、Update(bool all)などで処理を分けて対応してるかな。
パフォーマンスに問題ない限りは、富豪的プログラミングが管理しやすいと思う。 SetValueWithRefresh(newvalue)みたいな代入と更新同時にする関数作って代入はそれでやれってするとか
プロパティのsetterにonvaluechangeみたいなeventhandlerおいといてそこ経由して更新させるとか
ちまちま代入と同時に更新処理直接呼ぶとか
>>237みたいな富豪的なのもあるな
状況によりけりだよ シンプルにやるなら、Timerから更新用のメソッド呼べばいいんじゃね >>236
データバインディング
WinFormでも使えるんだぜ 初心者です。
c#でアプリ作成したのですが、自己署名証明書がないと、アプリ起動時、発行元不明の警告が出ますよね?
みなさんどうやってその警告を回避してますか?
何かいい方法があれば教えてほしいです。 配布するなら正攻法は証明書取得
個人でもできる。公証人に書類つくってもらって証明機関に申請すればいい。5年ごとに8万円ぐらい 一番安いのはWindowsStoreで、一度だけ18か18ドルぐらい払えばよかったはず >>243-244
情報ありがとうございます。
自己署名証明書の取得方法も色々な方法がある事を学ばせていただきました。 つか自己署名なら自分で勝手に作ればいいわけで...
自己署名じゃないちゃんとした証明書が必要なんだろうと >>246
自己署名の話を皆様に聞いた理由は、他の人のPCにインストールした際に、不明な発行元と表示されてしまうのを回避したい と言う理由だけなんです。
不明な発行元と警告が出る種類も何パターンかありますよね?
フォームで出るパターン と、ブルースクリーンの様な画面で出るパターン
この両方の警告に対応するには、お金を支払い自己署名するしかないのかなあと漠然と考えてました。
その自分で作成する方法(オレオレ自己署名)も見たのですが、アプリではない感じだったので、、あまり詳しく理解できていません。。 >>248
もしよろしければ、自己署名についてご教示願えないでしょうか?
なかなかこの辺の記事は書籍で書いてないので。。 >>249
調べるべきは「電子署名」であって「自己署名」じゃないぞ
もっと正解に近いキーワードは「コードサイニング証明書」と「MS Authenticode」 >>249は認識あってるよ
>>248はたぶん自己署名=オレオレ署名と勘違いしてるだけ
発行してもらった正規のでもオレオレのを使っても自己署名には変わらない
自己署名 =自分でexeに対して電子署名すること
電子署名 =電子的な署名
電子証明書=自己署名やsslなどで必要になるやつ(一般的には公的機関からのものを指すけど、自分で作ったのも含む)
オレオレ証明書 =自分で作った電子証明書
オレオレ署名 =オレオレ証明書を使った電子署名
コードサイニング証明書=電子証明書のうち、exeなどの署名に特化したもの(公的機関から買う。自分で作ったのは汎用的だからこう呼ぶことはない)
自己署名証明書 ≒コードサイニング証明書 >>251
ちょっとその調子で、「自己署名証明書」の定義も教えてくれ
ちなみに>>246での「自己署名」とは「自己署名証明書」の意味で書いてるわけだが
つか、
>>242も自己署名証明書はその定義だと考えてるのかな 自己署名証明書、自己署名、電子署名っての自体はオレオレ署名とまともな署名のどっちに使っても問題ない
だから自己署名=オレオレだと決めつけて解釈していくとあらぬ方向に行くんだよ
>>246は「勝手に作る」というような言葉が使われてるからオレオレ証明書のことだと分かるし
>>242は発行元不明を防ぎたいという文脈から公的な証明書のことだと分かる >>255
つまりお前は自己署名証明書での署名も「まともな署名」としてあつかうんだな >>251
アプリの発行にあたって必要なのは自己証明書じゃなくて信頼できる認証局から発行された証明書。
自分がその認証局自身でない限り自己証明書にはならない。 >自己署名 =自分でexeに対して電子署名すること
なんだこれ?こんな用法見たことない。 >>251,255みたいなのは
相手がビギナーや若手だと見るや嬉々としてデマカセを吹き込んでほくそ笑むタイプなんでしょ
本人はやってて楽しいのかもしれないけど傍から見てるとひどく滑稽 C#って移植性は高いんですか?入門書をのぞいてみたけどGUIの項目ではWindows限定でした 242 の質問者です。
僕の質問が悪かったせいで、少し雰囲気を悪くさせてしまった様で申し訳ありませんでした。
改めて質問させてください。
コードサイニング証明書の取得はどこが1番、費用が安いでしょうか?
聞くだけではダメなので、自分でもネットで調べてみました。
個人的にてはありますが、海外のECサイトで、1年で99ドルというものもありました。
ttps://blog.katsubemakito.net/articles/buy-comodo-codesigning
日本だと、1年で2万円が最安値?と認識してます。 それ、そんなに必要なものか?
ネットに転がってるフリーソフト使ってたらガンガン出るけど そもそも海外のよくわかんねー機関に金積んで得られるものに何の信用があるのよ? WIndowsで使えるってことはMSがその認証機関を信用してるってこと
認証機関がいい加減な仕事をして信用を失うとそこのルート証明書が無効化される 圧倒的に安いのはMSのWindowsStore
費用は大体2000円ぐらいで生涯使えるし、一つのアカウントを使い続けるならアプリは何本でも追加費用は取られない
問題はUWP,WinUI3で作るか、WpfやWinFormsならMSIX形式のインストーラに変更することとMSの審査があるのでそれを通さないといけないこと
Windows10仕様のアイコンも作らないといけない 便乗して質問だけどこういう認証ってのは
配布するインストーラのバイナリが「改竄されていない」、「配布元が会社名 CO LTD.を名乗る権利がある」ってのを保証してくれるだけ?
保証元として信用するのはデフォルトではMicrosoft(かMicrosoftが認証してる保証会社)だけって認識だけど >>267
「配布元が会社名 CO LTD.を名乗る権利がある」じゃなくて「アプリの配布元(がなりすましされていないこと)」の保証だね
個人でも取得できるコードサイニング証明書は無条件にはMSに信用されてなくて最初の内はSmartScreenが表示される(らしい)
法人しか取得できないEVコードサイニング証明書なら最初からSmartScreenは表示されない
後者は法人の存在確認が定期的にあったりより厳密 成りすまし/改ざん防止なら最近添えるのが流行りのpgpとかで十分なんじゃないの、何か悪い事が起きても俺じゃなくて他人が手を加えたせいだ、という証明にはなるから自己防衛には十分だろ
逆に言えば何かあったら言い逃れできないけど、認証機関を介さないが故に個人情報とは切り離せるわけで、トンズラも可能
書き手にとってはとても都合がいい >>270
目的が変わってるぞw
元はUACやSmartScreenで発行元不明って表示されないようにしたいって話
PGPはWindowsが対応していないからそれには役に立たない サイン証明って実はリソース部分書き換えてもついたままなをだよな。 リソースってのはCOFF的には只の特殊セグメントなんでな
更に、ユーザー定義リソースってどんなデーターでも
格納出来る形式があってだな、we留守の格納に...おや誰か来たようだ SmartScreenの警告はダウンロードしたときに
「ファイル名:Zone.Identifier」が勝手に作成されて起動時にチェックしてる TreeViewとかListViewの使い方が載っている本を教えてください。 >>231-234
遅くなりましたけどありがとうございました。もう時間も迫ってきたし色々と諦めてコードビハインドに書いてます。
ただそれでも色々と勝手が違って苦戦していますが……WPF難しすぎる…… >>275
本は無駄
検索したほうがいい
どうしても分からなかったら英語で質問 >>275
Windows95ユーザーインターフェイスプログラミング
ナンシークラッツ本 >>277 >>278
ありがとうございます。
今から勉強しているので必要になりました。
週末、本屋さんに行ってきます。 nLogは5.0からdatabase名前空間のパッケージが独立した
破壊的変更の場合はもう少しわかりやすいところに変更書いてくれよ
nlog.databaseを追加すりゃいいだけなんだけどさ >>279
本屋さんにこの手の専門書はほぼないだろうなぁ 本には詳しい説明は書いてないのでやりたいことを検索窓に突っ込んだ方がまし
listview databinding item 幅いっぱいとかw 相談です。
ランチャーを作りたいなと思い起動時は非表示(非アクティブ)に
何かのキーを押されたら表示したいのです。
アプリが非アクティブの時でもキーボードの入力イベントを取得する方法は無いでしょうか? >>286
サンクス!
WPFで作ってるんだけどグローバルフックを調べて組み込んでみました。
MainWindowをHideするとグローバルフックが効かなくなるので
MainWindowは描画をせずグローバルフックを動かして、
子WindowにWindowを描画してHide/Showするようにしたらなんとか形になりました。
こんなのでいいのかなんだかすっきりせず。 >>287
なんでだろ?メインウィンドウからフック仕掛けてる?
Formsの頃の記憶だけど、Application.run以前にSingletonな管理クラス作ってやってた。
そいつからイベント送られてくるようにしてたよ。
それで問題なかったはずだけど、なんか変わったんのかな。 以前HotKeyで作ったけど中身はグローバルフックなんかな Utf8Parser.TryParse(span, out DateTime date, out _, 'O')について聞きたいんだけど、以下の文字列はUtf8Bytesとして
"2022-01-01T00:00:00.0000000Z" ← 28文字のこれなら正常に成功するのに
"2022-01-01T00:00:00.000000Z" ← 27文字のこっちは失敗する
DateTime.TryParseなら後者も成功するんだけどこれはUtf8Parserがポンコツってこと?
それともDateTime.TryParseがオーバー解析してくれてるだけで28文字未満の"O"形式のDateTime投げてくる方が非常識? >>290
失敗しても仕様の範囲内ぽい
> ラウンドトリップ ("O"、"o") 書式指定子
> "O" または "o" 標準書式指定子は、DateTime 値の "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK" カスタム書式指定文字列と
> DateTimeOffset 値の "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffzzz" カスタム書式指定文字列に対応します。 >>288
レスありがとう!
MainWindowからフックしています。
シングルトンにはしてないですが、MainWindowは生きているので、
フック自体は破棄されていませんが、どうもダメでした・・・ >>285
特定のキーで表示ならSystem.Timers.Timer使ってGetKeyStateとかでキー入力監視
キーがヒットしたらタイマー止めて目的のウィンドウを表示
ずっと監視するのが嫌でなければ実装はかなり楽な方かと
アプリランチャーならタスクトレイに格納してマウスクリックで表示させての方が使いやすい気がするけど >>285 です
>>288 さんの
>Application.run以前に
というのをヒントに、WPFなのでrun()は無いけど、Appにコンストラクタを記載しその中でフックを起動して、
キーダウンのイベント内でMainWindowを取得し制御する事で上手く行きました!
その他手法含めご教授してくださった方々有難うございます! >>291-293
現状だと28文字未満だったらUtf16に変換してDateTimeの方でやるしかないか
そこそこ知られてるWebサービスのAPIがたまに桁詰められて27文字の投げてくるんだよね 悪いけど、Webのレスポンスだったら最初から全部UTF16でやっても全くパフォーマンス変わらないと思うよ >>299
そんな大きなペナルティがあるとは思ってないけど全く変わらないというのはどういう原理で?
JsonDocument.Parse(response.Content.ReadAsStream())みたいな感じでやってるけど、これだとUtf8のままパースされてるよね 用途次第じゃない?
HTTPSの通信に比べればJSONのデコードなんか誤差だから単一の処理で見るなら全く意味ないだろうけど、
もし大量のリクエストを捌くサーバーを作っているならCPUやメモリの使用率を削減することでサーバーのインスタンス数を削減できるかもしれない そこまでシビアなら、他にもっと先に見直す所があると思うけど WindowsFormはそれなりに少し経験はあるんですが行き詰まっているので相談です
centos7にapach上で、これまでhttpd.confにAliasで特定のドキュメントルーツを設定して
phpでつくったWebアプリをいくつか動かしている環境があり、ここに新たに
Blazorサーバやってみようと、dotnetインストールしてrunまではできてます
(配置したdllを実行するserviceをつくってそれも起動可能な状態)
phpでつくったアプリのようにAliasで簡単にできるかなと思ってたらそうでもなく
サイトググるとVirtualHostの例がちらほら
example.com/app1 ・・・ var/www/app1 にphpアプリ配置
example.com/app2 ・・・var/www/app2 にphpアプリ配置
example.com/blazor を新たに配置するにはどの辺調べればいいですかね
MSのドキュメントやBlazorや先日でたNET6の書籍とか見ながらいろいろやってはみたものの
どれもうまくいかず、行き詰まっております(方向性を見失ってます)
リクエストきたものをkestrelに渡してやらなきゃいけないってのはなんとなく理解してますが
VirtualHostとリバースプロキシをきちんと理解しないでできないですかね ドキュメントルーツ・・・ドキュメントルートです
すみません IISでホストしてApache側でVirtualHostの指定でリバースプロキシすりゃいいよ
頭悪い構成だが、その調子だとリバースプロキシの設定はなんとかなってもどうせdotnetアプリを常時起動する方法が見当つかないんだろ? >>303
リバースプロキシ使用時はhttps使わない構成にしなきゃダメだぞ >>303
すでにデーモンとして動かしてるならリバースプロキシするだけ
ググって適当にコピペでまあいける
本番だったらちゃんと理解してやったほうがいいと思うけど 数か月ぶりでここ覗いてみたけどまだ結構人がいるみたいでちょっと安心したw
以前は旧FireFoxのChaikaってアドオンをだましだまし使ってたんだが、(それがいよいよ
使えなくなったのが来なくなった理由)今回JaneStyleを入れてみたが、作者さんを批判する訳じゃないが、
UIは25年前のWin98時代のものだし鬱陶しいエロ広告は表示されるし結構萎えるなこれ
C#といっこも関係ない話題ですまん みなさんレスありがとうございます
>>305
serviceつくって常時起動はできてるかなと思います
>>306 >>307
稼働WEBサーバはhttpsのみなので、ってことは今の構成でそのままっていかないんですね
(Rewriteでhttpをhttpsにしている)
ネットの設定例にある、http://localhost~; をhttpsにしていましたが
ネットで見つけられた設定例って、そのサーバの全アクセスをリバースプロキシさせるようなものがほとんどで
自ドメインの特定のアドレス(上でいう、example.com/blazor)だけを
リバースプロキシさせてdotnetが受け取れるようにってできないもんでしょうか?
できるということであれば、どうにかして調べます
バーチャルホストは複数のドメインを扱ってて、Aliasは同じドメインで複数のドキュメントルートを扱えると
考えているので、やりたいことはバーチャルホストでできないんじゃないかなと思ってるんですが
サブドメインにしちゃえば1つのドメインでもやれますかね >>310
ありがとうございます
後者の方はhttpでうまくできました
ただ、実際はユーザーからhttpsでつながせたいのですが
証明書がないのでブラウザで開いても動作確認できず
メインドメインのSSL証明書だと、ワイルドカードだと割高なのでドメインを
追加するしかないかなと思うのですが、
VirtualHostの設定内に取得した証明書の設定書いてやれば
httpsで動作させることができると考えてもいいんでしょうか?
下みたいな感じで。前者の方ならそんな手間も費用もいらないんでしょうが、方法がみつからない
<VirtualHost *:443>
ServerName hoge.example.com
ProxyPreserveHost On
ProxyPass / https://localhost:5001/
ProxyPassReverse / https://localhost:5001/
RewriteEngine on
RewriteCond %{HTTPS} on
RewriteCond %{HTTPS:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTPS:CONNECTION} Upgrade$ [NC]
RewriteRule /(.*) ws://127.0.0.1:5001/$1 [P] SSL部分書き忘れましたが、書き方は省略します
SSLEngine on
SSLCertificateFile [crtのパス]~~以下略 >>311はいちど撤回します
Program.csでapp.UseHttpsRedirection()が抜けてたのでそれを加えつつ
前者の方をLocationでなんとかhttpsでの表示までたどり着きましたが
どうも完全な動作をしてない様子です
(Blazorの学習用のテンプレートでメニューやテキストだけだけ羅列された状態)
<Location "/blazor">
ProxyPreserveHost On
ProxyPass http://localhost:5000/
ProxyPassReverse http://localhost:5000/
RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
RewriteRule /(.*) ws://127.0.0.1:5000/$1 [P]
</Location>
もう一息な感じなんですが・・・ 解決しました
サーバー側でなく、ソース側の修正で表示できました 古い話題で恐縮なんですが質問です。
https://docs.microsoft.com/ja-jp/dotnet/standard/asynchronous-programming-patterns/calling-synchronous-methods-asynchronously#executing-a-callback-method-when-an-asynchronous-call-completes
IAsyncResult result = caller.BeginInvoke(3000,
out dummy,
new AsyncCallback(CallbackMethod),
"The call executed on thread {0}, with return value \"{1}\".");
begininvokeで呼び出されたのが終わるとき、callbackmethodが呼び出されることまではわかりました。 途中送信すみません。
callbackmethodを見ると引数にIAsyncResult arとありますが、これはどこから来たものでしょうか?
begininvokeでは呼び出す関数を指定してはいますが、その関数に渡す引数は指定していないように見えます。
よろしくお願いします。 https://docs.microsoft.com/ja-jp/dotnet/api/system.asynccallback?view=net-6.0
のとおり、AsyncCallbackは
「public delegate void AsyncCallback(IAsyncResult ar);」
と定義されてるデリゲートだけど・・・? >>317
> callbackmethodを見ると引数にIAsyncResult arとありますが、これはどこから来たものでしょうか?
.NET側で作成して必要な情報をセットしてCallbackMethodを呼び出すようになってるだけだよ >>318
あーいやですからcallbackmethodが実行されるときの引数arはどこにあるのかという話で
>>320
引数は勝手に.NET側が指定してくれるということでしょうか CのDLLから呼び出し規約cdeclのコールバック用の関数ポインタを要求された場合、
C#のデリゲートを受け渡し出来る方法、もしくはC#側でcdeclの関数を作る方法はありますか? GetFunctionPointerの説明にはDelegateの定義にUnmanagedFunctionPointerAttributeをつけるとCallingConventionを制御できると書いてある なるほど、属性で指定するんですね
ちょっと試してみます 半角の#は制御文字で
しょうもないバグの要因になるから使いたく無いんだよな
なんで#なんか名前に使ったん? >>328
どういう意味の「制御文字」?制御文字というとふつうは0x00-0x1fを想像してしまうが。 まあ#よりはマシなのでは
ただしcppって略してc preprocessorと被せるのは許さん どう見ても問題になるのは+の方
正規表現で邪魔になる c+4ってなるよりはマシ、、、
もっといいセンスあったやろなあ今更やが しょうがないんだ
あの時代は自称ヒッピーのキモオタ世界だったし、Microsoftはすべての商品名の他に社名までが究極的にゴミクソ脱糞太郎だからな
何が.NETだボケ +++だとモデムがコマンドモードに入って具合悪いからな Cpp って C pre processor のことだろ 底辺職業ランキングで c# プログラマが一位を獲得。
底辺職業の条件 3つ
1. 同じことを繰り返す。
for ループつかってるよね。
2. 誰でもできる
スタックオーバーフローを見れば、c#プログラミングなんて誰でもできる。
3. 体力勝負
https://i.imgur.com/0BRVa3M.jpg
c# アプリケーションのビルドが含まれているとのこと。 VisualStudio 2015 ターゲットフレームワーク .Net Framework 4.5.2
Shownイベントで発生した例外をApplication.ThreadExceptionでキャッチ
したいのですが期待する例外が届きません。
何が原因なのでしょうか。
public partial class Form1 : Form {
[STAThread] static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ThreadException += ShowException;
Application.Run(new Form1());
}
private static void ShowException(object sender, ThreadExceptionEventArgs e) {
MessageBox.Show(e.Exception.ToString());
}
private void Test() {
try {
throw new Exception("1 起点");
}
catch (Exception ex) {
throw new Exception("2 期待する例外", ex);
}
}
public Form1() { InitializeComponent(); }
private void Form1_Shown(object sender, EventArgs e) { Test(); } //1が届く
private void button1_Click(object sender, EventArgs e) { Test(); } //2が届く
} 古いのを使わないといけないプロジェクトに放り込まれる辛さってあるよね……
客先行ったらvisual studio 2010だと言われたときの絶望 >>345
https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Form.cs,4908
理由は分らないけど↓が原因っぽい
this.BeginInvoke(new MethodInvoker(CallShownEvent));
試しにbuttun2を追加して以下のコードを実行したら同じ現象が発生した
private void button2_Click(object sender, EventArgs e) { BeginInvoke(new MethodInvoker(Test)); } >>347
使わなければいけない理由って何だろう?慣例で使い続けてるのなら承諾得てバージョンアップするべきだし、予算の都合なら上を説得して稟議出すべき >>349
自社のプロダクトなら何とかなるが他社のは無理だ。
未だにVB6使ってる所もあるし。
.NET Framework 4.8はVB6と同じようになると思う。 >>349
受託でも自社でもいいけど売り物の開発したことないのか?
新しいVSでる度に新バージョンに移行なんてやってられないぞ
なんのためにMSがサブスクで過去バージョン使えるようにしてると思ってるんだよ VS2022スレに書くか迷ったけどスレの勢いがありそうなこちらに
razorページ書いてて、コード部分や変数部分が色が変わるけど、ページスクロールさせていくと一定の場所からプロパティの色がとぶ
上に戻ると表示は直る、消えているときは数秒ごとに付くべき色が一瞬ちらつく
メソッドの定義なんかは色が付いたまま
考えられる原因ってありますかねぇ
伝わるかどうか不安ですが、、、 >>347
VS2010なら未だマシ。.slnファイルは2010以降なら概ね互換性あるから。
2005とか2008なんて案件に放り込まれた暁にゃ...
>>349
UIコンポーネントのデザイナがそれ以降のVSだと動かないとか。 >>349
上がVSとターゲットビルドバージョンの区別がついてないから C#の関数ポインタでstaticなメソッド(GC管理下)のアドレスを保持するとき、GCによってアドレスが移動して参照出来なくなる、といったことはありえますか? 関数のアドレスが移動することはない
dllのアンロードにより消え去ることはあり得るがそれはプログラマの責任 >>358
ありがとうございます。うまく調べられなかったので助かりました blazor触ってるんですが、デバッグでチェックしていると
開発ツールでbodyタグの最後に
live-preview-rootというタグが入って
hiddenのdiv内にsrcがYouTubeのアドレスの入ったiframeが入るんですが、なんですかねこれ、、、
アドレスはyotubeのあとにstaticやらscheduleなどが続いていて、踏んでもソースがでるだけ
ページ表示させただけでは出てなくて、開発ツールの要素にだけ出てくるのですが、ビルドしてサーバに置いた場合は出ない、、、あくまでもデバッグ中のページのみ
そもそもプロジェクト内にはYouTubeの文言はないし、クロームでもedgeでもでます
vsの仕様なのか、なんなのか、、、
心当たりある方いますか? ちなみにテンプレートからの新規作成プロジェクトの時点出てるので、ソースそのものの問題ではないと思うのですが >>367
最初に気づいたのがEdgeで、Chromeでも同じでした
Firefoxだと、live-preview-root #shadow-root(open)までで
iframeにYouTubeへのリンクは出ませんでした
EdgeってChromeベースで、Googleのスクリプトみたいなのが
勝手に差し込まれるんですかね、、、 皆さん、インクリメントとデクリメントについてどのようにお考えですか?
個人的にこれを使うことに抵抗があります(無知が理由で)
特に、内部メソッド等にローカルなintを渡して処理後に1だけ加算したいときってよくあると思うんですが、
int num = 0;
M(num); num++; これと
M(num++); これは、本当に常に一致してくれるんでしょうか?
IL上での違いはこんな感じでした
// M(num);
IL_0003: ldloc.0
IL_0004: call void C::'<M>g__M|0_0'(int32)
IL_0009: nop
// num++;
IL_000a: ldloc.0
IL_000b: ldc.i4.1
IL_000c: add
IL_000d: stloc.0
IL_000e: nop
// M(num++);
IL_0003: ldloc.0
IL_0004: dup
IL_0005: ldc.i4.1
IL_0006: add
IL_0007: stloc.0
IL_0008: call void C::'<M>g__M|0_0'(int32)
IL_000d: nop
IL_000e: nop
これって最終的には同じコードなんでしょうか?
可読性以外の差異がありましたら教えていただけないでしょうか。よろしくお願いします そんなに気になるならデバッグで逆アセンブルコードでも見ればええやん >>370
引数の値の評価が違う
前者
numを評価(変数numの値は0)→M呼出し(引数の値は0)→num++を評価(変数numの値は1)
後者
num++を評価(変数numの値は1)→M呼出し(引数の値は1)→変数numの値は1 あれ、
「m(++num)」ってインクリメントが前なら引数が加算後の1になるのは分かるんだけど
「m(num++)」だと加算前の0が引数になるんじゃ?と思った
個人的にはインクリメント結果を代入したり引数にしたりする使い方は禁忌とすべきだと思う
使っていいのは単項目で「i++;」みたいなことをするときだけにしておきたい
できることならfor (var i=0; i<length; i++)みたいな定型for以外は面倒でも
「i = i + 1;」と書かせたいくらいだなあ >>372
後者の説明間違ってるぞ。それじゃ++numの場合だ。
num++だから引数は0 言語仕様としては厳密には未定義なのかも知れないが、少なくとも>>370のILの中身見た限りでは引数評価後に関数呼び出しが行われる様に実装されてる 未定義というより環境依存かな
大抵の言語では関数の呼出しと引数の評価順は明確化されてないのでいわゆる副作用として扱われる >>375
ちゃんとIL読みなよ
後者はnum++の評価自体は関数呼び出し前だけど、その前にdupが入ってるから、引数は評価前のnumの値(0)でしょ >>376
複数の引数の評価順が未規定なのはよくあるけど引数の評価前に関数呼出するような言語なんてあったっけ? そういう読み違いが発生しそうなコーディングすんなって事でいいのでは 言語仕様の話とコーディングルールの話をごっちゃにすんなよ https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/expressions#1141-general
Operands in an expression are evaluated from left to right.
Example: In F(i) + G(i++) * H(i),
method F is called using the old value of i,
then method G is called with the old value of i, and,
finally, method H is called with the new value of i.
This is separate from and unrelated to operator precedence. >>381
それは演算子のオペランドの評価順
今回の件とは別の話で、未規定の言語(例 C言語)もある 複数の評価が連続した場合の副作用完了点は大抵の言語で規定されてない
例えば上の様に関数に与える引数の中の式で副作用を起こす場合これに該当する VC++は未定義動作でーすでバージョン変わったら評価順も変わって結果が変わる
cout <<i++ <<i++<<i++<<i++<<i++<<i++; C++は17か20で言語として評価順定義されるようになった この辺の仕様全然詳しくないけどさ
++numとか分かりにくいし行儀悪いし個人的にはいらないと感じる
num++だけありゃいい
for文の++iteとかこんがらがるからマジやめてほしい static int i;
i += i++ + ++i; >>386
for (int i = 0; i < end; ++i)とした方がコンパイラへの負担が少なく最適化が効きやすかった時代があったからな
前方演算は一時バッファが必要ないからね
そもそも前方演算は普通に多用するし意味も一目で分かると思うが >>388
書き方が悪かったな
記法はnum++か++numのどっちかに限定されてりゃ機能的には前方演算だけでいいと思ってるよ
for文の中とかで++iteって書くかite++って書くかで挙動が変わるのが直感的じゃないって話な
そもそもC#はforeach使うんだから++ite or ite++なんてC/C++でしか見ないし
使い分けるメリットより処理の流れがぱっと見で分かりにくくなるデメリットのがでかい そりゃ整数とかなら n++ でも ++n でもほぼ変わらんコード吐くけどクラスのインタンス変数だと n++ は前の値をコピーしとかないとダメなケースがあるからまとめられたら困るよ >>389
i = i * 3 + 2;
と同じ。 >>392
クラスのこれがあるから++nが身に染み付いたわ >>392 >>395
ちょっとイメージつかんから具体例教えて .Net Core以上だとビッグエンディアン環境にも対応するようだけど、ターゲットOSをWindowsにしてビルドする限りは100%リトルエンディアンって認識で大丈夫?
窓用である限り絶対にLEであるならLEなバイナリファイルに対してポインタ使いたいんだけど そこまで実行環境限定できないなら
Main直後にエンディアン調べてビッグエンディアンでは動きませーんってメッセージだしときゃいいんじゃね
今なくても未来永劫ないとはいえんわけだし いいのでは
っていうか、今の時代のビッグエンディアン環境ってどんなんだろ 64bitの時代でもリトルエンディアンとか関係あるのか
バイナリデータを直接操作する用途以外は関係ないんじゃないの I/Oが一切発生しないコンピューターならそうかもな バイナリ「データ」のファイルなら、自分でフォーマット決めとけばいいだけじゃ?
コードを直接バイナリファイルでどうこうするって話?
.NETのプログラムってVM上で動いていると思ったんだが、CORE以降だと違うのか? >>408
自分でフォーマットを決められないケースもあるでしょ
例えばリンカー、実行ファイルのフォーマットはOSなどで規定されてるからそれに沿って出力しないとダメでしょ マシン語やアセンブリ言語だと
CPUの仕様によってコードの並び順を考えなきゃいけないだろうが
C#ではコンパイラで全部やってくれるから気にしなくて良いんじゃないの バイナリファイルがあってそれがビッグエンディアンかリトルエンディアンか分かってないなら
どちらにしても意味がない
プログラムがとかc#がとかいう前の段階 >>408
VM上で動くのはJava
.NETは中間言語を実行時にネイティブ言語にコンパイルしてそれが直接動く >>393
ほんとか?
static int iはiが0だから式全体が定数にコンパイルされてその結果を使ってないから消えるんじゃね?
あとi++と++iは左から順に評価されると保証されてんの? IEnumrable<T>に.ForEach拡張がデフォルトで用意されてないのは端的に言って何故?
List<T>にはあるのに
↓の問題は?速度?
public static void ForEach<T>(this IEnumerable<T> items, Action<T> action) {
foreach (var item in items) {
action(item);
}
} ソートの質問です。
タブ区切りのCSVファイルを1行ずつそのままlistに入れた後、list の区切り[16]と[17]に数字が入っていてこれを[17]優先、次に[16]で降順ソートがしたいです。
調べるとラムダ式という便利そうなものが引っかかるのですが、区切って使用することは出来るんですかね? CSVをそのまま使うんじゃねえ
読み込んだらパースしてオブジェクトに直せ
パースはstring.splitとか使ってるやつ多いがバグを防ぐためにcsvhelperとか使え >>417
var sorted = File.ReadAllLines("data.csv").Select(line => line.Split(',')).OrderByDescending(x => int.Parse(x[17])).ThenByDescending(x => int.Parse(x[16])); タブ区切りか
それTSVやん
まあソートの方が要点だろうからパースの方はご自由に tsvはcsvの一種だがどうしてお前らはsplitを使いたがるんだ >>419
これで読み込んでソートまでいけるんですか?凄いですね。
明日試してみます。ありがとうございます。 今度はsortedが文字列になってないと言い出すぞ >>423
File.ReadAllLines("data.csv").Select(line => line.Split(','))
↑ここまでがcsvをカンマで区切るコードでタブ区切りならSplit('\t')に変えてね
上で言われてるようにSplitだとセル内文字として'\t'が入ってると全てズレてきてしまうのでガチでやるなら専用のパーサーライブラリに頼るべきだが 手抜きCSV実装はバグの元なのでライブラリ使え
規格に沿って真面目に実装するとそれなりに面倒 csvの標準って無かったはずだけど?
infoのrfcのこと言ってる? Microsoft.VisualBasic.FileIO.TextFieldParser がお勧め。
本来はVB用のライブラリだが普通にC#からも呼び出せる。 フィールドに改行もダブルクォートもカンマも使わんならSplitでええけど
そうじゃないならCSVHelper使っとけ Ruby で作った
タブ区切りの入力ファイル・input.tsv が以下の時、
-1 1.1
-2 -2.2
5 1.1
3 3.3
1 1.1
require 'csv'
# タブ区切りで、:numeric は、:integer と :float の組み合わせ
options = { col_sep: "\t", converters: :numeric }
table = CSV.read( "input.tsv", options )
sorted_ary = table.sort_by do |col_0, col_1|
[ col_1, -col_0 ] # col_1 の昇順で、col_0 の降順
end
p sorted_ary
出力
[[-2, -2.2], [5, 1.1], [1, 1.1], [-1, 1.1], [3, 3.3]] >>427
ExcelのCSVが扱えれば問題はまずおきない Excelのセル中途中改行、途中ダブルクォーテーション、途中¥
の全てが複雑に1つのセルに入ってても問題なくExcelと同じ解釈になるのが、事実上の要件やろな。 カンマと改行と"を何らかの方法でエスケープすればスプリットでも問題ないな
CSV化はエンコーディングした文字列をstring.Joinでカンマ区切り
読み取りはカンマでスプリットした後デコード
エンコーディングにBASE64とかパーセントエンコーディングが使えれば面倒無さそうな気がしたがどっちも半角記号をそのまま通すからだめだわ
自作しても大した手間はかからんけどCsvHelper使う方が明らかに楽だからなあ
あとExcelで開いて文字化けと思われる可能性も無くはない >>437
正規表現とDictionary<T>を使えばもう少しはエレガントに書けるし速度のためにはLengthの倍の大きさのバッファを用意してSpan<char>を使うべきなのかもしれないけどイメージとしてはこんな感じ
string Encode(string src) => src.Replace("=", "==").Replace("\r", "=r").Replace("\n", "=n").Replace(",", "=c").Replace("\"", "=q"); >>438
今更だからだよ
質問したやつが本気にしなくて済むタイミングでないと使う可能性があるだろ
こういう時は脳死でCsvHelper使っとけばいい
VBのやつはいつまで使えるかわからん >>437
独自エスケープみたいな加工するくらいなら、そもそもCSVである必要すらない
ライブラリ使うか、CSV形式をやめるかどちらかだ まあ独自フォーマットが選べるならJSON使え、CSVでなきゃいけないのならCsvHelper使え、で済む話ではある nugetをfixedで検索して、ダウンロード多い奴でそれっぽいの探してみりゃいいんじゃね 固定長ならstruct割り当てて文字列はnew string(Span<T>)すればいいやん var 〇〇
これってなんでも型ってことですか?ネットで検索するとよく見かけるんですが使い分けとかあるんですか? int[] A = new int[100];
A[i]にfor文で0-9番目の要素まで数値格納
Array.Sort(A);
これやるとAの0-89番目の要素が0になって肝心の入力が後ろに行ってしまう
int[] AA = A.where(item => item != 0).toarray();
に配列を作り直すと入力が0だとそれも消してしまう…
何かいい方法ありますかね…
最初からListつかって以外で イマイチよくわからんが
Array.Sort(Array, int, int)
で部分ソートすればいいって話? フォルダ削除する際に、削除するフォルダを誰かがそのフォルダを開いてる?使用してる状態だとエラーになるのを防ぐ対処法って何かありますか? そのエラーが例外なら例外処理すればいいんじゃないの? エラーを起こさずに無理やりにでも消す方法はありませんか?と聞いていると思われる
俺は知らない 他のプロセスが読み書き中に外部から消せたらヤベーだろ常識的に考えて
削除失敗後のエラー処理頑張るしか無いんじゃない アンドロイドアプリの開発してるならだいたいadbのせい
powershellでps adb|killとやると削除できるようになる
それでも削除できなければリソースモニターのハンドル検索にフォルダ名を入れれば出てくる 誰かがって言ってるんだから、サインインしてる他の人アカウントか、共有ドライブとかの話じゃないの? 深読みしすぎだろ
例外の対処の仕方が判らんだけだと思うが linux環境のmonoなら開いてるファイルだろうが消し放題なのでは こういう「何が言いたいのか日本語レベルでわからん質問」を投げて回答しようとした人たちが首をひねってるのを見て何も言わない質問者って何なんだろうな
コミュ障すぎるだろ bool isTrue;
if (isTrue) isTrue = false; // ブロック無し
else return;
// 処理
isTrue = true; // ここから
return; // ここまでの間は気にしない
これってスレッドセーフになってくれますか?よろしくお願いします! isTrueがローカル変数じゃないならなってないな >>468
> if (isTrue) isTrue = false; // ブロック無し
> else return;
典型的なダメコード
> if (isTrue)
と
> isTrue = false;
の間に他のスレッドが割り込んだらおかしくなるだろ ならないですよねぇ…都合良すぎました…
ありがとうございました! デリゲートのPredicateの使いどころを教えて下さい
Funcの戻り値をboolにしたのと同じじゃないですか? >>475
https://learn.microsoft.com/ja-jp/dotnet/api/system.func-2?view=net-6.0
.NET Framework 3.5かららしいぞ
Predicateの意味がわからんとしたらEventHandlerも意味わからんのだろうな
それAction<object,EventArgs>と同じじゃないですかって
同じだよ 単一バイナリビルドってEXEはできるけどDLLはできないのかな 超初心者+わかりにくい文章で、ごめんなさい。
今までは、.NetFramewor4.72でWinFormを使って実装していました。
今、.Net6.0 の WinFormで実装する必要が出てきたので
.Net6.0 で実装しています。
.NetFramewor4.72 でWindowsBaseの参照の追加で使えていた
System.Windows.Threading.Dispatcher が
.Net6.0 では、「依存関係」の「COM」で設定しようとしても、
WindowsBaseが表示されず、WindowsBaseを設定できなくて
System.Windows.Threading.Dispatcherが使えなくて、困っています。
同じような課題を諸先輩方は
どのように解決されましたか? >>478
バージョンは正確に。4.7.2ね。
Dispatcher.Invoke()を使いたいってことなんだろうけど、これはかなり古い方法。
async、awaitを使うか、TaskとTaskScheduler.FromCurrentSynchronizationContext()を使う。 >>479
アドバイスありがとうございます。
バージョンは、4.7.2です。
いただいた内容で考えてみます。 >>478
stackoverflow.com/questions/68300971/wpf-dispatcher-for-dotnet-5
.NET 5の話だけど、6でも同じはず
プロジェクトファイルに
<UseWPF>true</UseWPF>
を追加する >>481
コメントありがとうございます。
478です。
現在すすめているのが、
Winformで進めているんです。
アドバイスいただいた内容を参考にしてみます。 >>482
<UseWPF>true</UseWPF>
<UseWindowsForms>true</UseWindowsForms>
この両方をtrueでいいんだよ
cf) //learn.microsoft.com/ja-jp/dotnet/core/project-sdk/msbuild-props-desktop#enable-net-desktop-sdk >>483
プロジェクトファイルに
<UseWPF>true</UseWPF>
<UseWindowsForms>true</UseWindowsForms>
両方を追記しましたら、
using System.Windows.Threading;
が使えるようになり、
Dispatcher
も使えるようになったみたいです。
アドバイス本当にありがとうございます。
m(_ _)m 初心者が仕事で振られるにしちゃボトルネックだから違うんじゃね
そいつができないと他全員することない 初心者が問題解決するまで先輩たちは休憩室で麻雀打ってるよ 今日知ったんだがSilk.NETってものがあるみたいね
これ一つでマルチメディア系のものを使用できるようになるみたい
OpenGLやDirectXとか
いかんせん情報ないけどどんな感じなんだろうか?
https://dotnet.github.io/Silk.NET/ 大体マイナーなライブラリは情報が殆どないから
githubのサンプルやデモ(あれば)を実際に動かしてみるしかないんじゃね >>489
一応サンプルやチュートリアルはあるからやってみるかな
マルチプラットフォーム対応は俺からしたら注目度高い
.NET MAUIでも使えるのか知らんけど(Xamarinはいけるらしい) <Frame>
<カスタムコントロール>
<Label/>
<Label/>
<Label/>
</カスタムコントロール>
</Frame>
wpfでこの構成のlabelからダブルクリックイベント取得する方法教えて
単純にイベント追加するだけじゃ取れなかった。バブリング、トンネリング、添付イベント辺りが関係有りそうだなぁと思って色々調べたんだけどよく分かんなくて そうするとラベルがある場所以外でイベント拾っちゃう
どのラベルがクリックされたのかが欲しい カスタムコントロールじゃなくてユーザーコントロールだった ラベルはマウスイベントなんか受け取らんだろ
ラベルのテンプレートを挿入したコントロールを作れ Frameの中のコントロールがクリックを拾えなくなる話なんて聞いたことがないしさすがにそれは異常だな
まあフレーム自体が拾えるとしたらその時のカーソル位置でコントロールは特定できるし最悪それでごまかすしかないかな
どこかでイベントの伝播をせき止めてるかもしれんくらいしか想像できん >>491
そのカスタム、じゃなくてユーザーコントロールでルーティングイベントを止めてるんじゃね? ていうかもしかしてユーザーコントロールの中のラベルのイベントをウィンドウで受け取ろうとしてるのか? あーもしかして普通に出来ない事をやろうとしてた?
ユーザーコントロール内のオブジェクトからのイベントを扱うのは一般的なやり方じゃないの? WPFのスレでXAMLが大きくなりすぎたから分割したいと言ってたやつかな?
気づいてないということは多分バインドエラー出てると思うから見てみなよ もしかするとFrameのある親フォームにStyleのEventSetterでイベントハンドラを記述して、
UserControlのイベントを取ろうとしていたのかな?
そういう分割は不可能だわ なんかダメそうだからイベント直接取るのは諦めたわ
クリックした座標の下にあるオブジェクトを取得みたいなのはユーザーコントロール内のオブジェクトでも出来る? いやだから分割するなら再利用できるようにしろよ
再利用できるようになってないから最初の利用すらできなくなってんじゃん そこから説明するんか
バインディングできるよう依存プロパティを作りアタッチできるようイベントを作り今のページに依存せず他のページでも使えるように作る アタッチできるようにイベントを作るというのは具体的にはどうやるの?
解説サイト探すからキーワード教えて Frameの中にはPageを入れるのが普通で
だからあの設計だとPageを使うことによって自然にXamlが分離される設計になると思う あの設計がどの設計かわからんけどページにすればイベント取れるの? 普通の状況ではLabel.MouseDoubleClickイベントは発生するという前提で
(.NET Framework 4.8で試したら普通に発生したけど)
PreviewMouseDoubleClickイベントを使ってみる
無理ならコードで
theLabel.Add(Control.PreviewMouseDoubleClickEvent, handler, true);
とやってみる コントロール選び間違ってないか?
ラベルってダブルクリックするもんじゃないと思うんだけど C#の言語についての質問じゃなくて申し訳ないんですけど
C#使ったウェブ開発って今需要どれくらいあるもんなんでしょうか。肌感覚程度でいいんですが
これまでの仕事もっぱらデスクトップアプリ開発ばっかだったので。路線変更したいんです KENTA
未経験からのエンジニア転職の必須教養【技術知識編】
www.youtube.com/watch?v=Q1c09rrhTjo
奇をてらって、Laravel, Django を選ぶな。
転職先が多い、Ruby on Rails が有利。
キャリアパスも、Rails → Go だけ。
RUNTEQ、東京フリーランスのデイトラなど、ほとんどのサロン学校も、Rails。筑波大学とかも
デジタル庁さんのエンジニア求人が炎上してる件
www.youtube.com/watch?v=2ONVxwmOkn4
C# のバックエンド経験が3年という条件に、彼は0.1% もいないと言ってるw
ベンチャーは、ほとんどRails。
食べチョク、Wantedly, Zenn, Qiita, Note、世界最速のdev.to など
そもそも、バックエンドにWindows が無い。
今のシステムは、Docker ばかりだから、DockerはLinux だけの技術
Linux, Docker, AWS などが必須。
だから米国年収では、Rails, AWS Solution Architect が、2千万円近くになっている。
最も稼げる資格。チート職 ほんと日本ってRuby on Railsって多いんだな
日本とポリネシアだけがRuby on Rails>ASP.NETみたいだ Ruby on Rails はShopify, Airbnb など、米国で時価総額1兆円以上の企業も多い
Github は、Go へ移行するとか?
一方、Gitlab はRailsを使い続ける宣言をしている
ガーシーのサロンなどで使っている、Mastodon はRails 6。
作者のドイツのオイゲン・ロホコは、PHP からRailsへ変えた。
Rubyの方が可読性が高いから asp.net は、Windows じゃないの?
今のシステムのほとんどがDocker で、
DockerはLinuxだけの技術だから、プロはLinuxしか使わない。
Windowsを使う香具師は、まずいない
それに、WindowsのOSの本も、ほぼ無い。
Linuxの本ばっかり
Docker Desktop には、Kubernetes も入っているけど、
AWS, Docker, Kubernetes がほとんど
Kubernetesが無ければ、オーケストレーションできないし、
Windowsではシステム構築運用できないでしょ
Windowsは数十年前の技術じゃないの?
それか、プロじゃなくて、単に会社内のシステム運用部門が使っているだけじゃないの?
アマチュア 基地外の援護をするつもりはないが>>522のASP.NETのシェアの内訳は大半がClassicかMVCだろう
絶賛急降下中のオワコンルビ糞よりは遥かにマシだが、今後10年でどれだけシェアを落とさずにCore系へ移行できるかが勝負だね ZennはRuby on Railsを使って後悔したらしい 例えば、典型的なウェブ開発ベンチャーの求人情報は、
マザーズのSKIYAKI は、Rails, AWSを用いたWebサービス開発。
食べチョクのビビッドガーデンは、Rails, AWS/GCP
Wantedly などに一杯ある >>522
信頼と実績のMicrosoftよな
開発者フレンドリーだし最高 >>523
一人の人が見える景色は意外と狭い
景色ではなく、数字を見よう よく知られてる大手企業でも内製システムは普通にWindowsだらけ
社内SEがLinux知らんとかVB6あがりとかが多いし、そういった人達は社内対応に追われて新しめの技術に触れるのが難しい Linux コマンド、bash, シェルスクリプトの本は一杯あるけど、
Windows のコマンド・シェルの本など、ほとんどない
まず、サーバーが管理できないし、OSS のライブラリも無いでしょ。
プロじゃなくて、アマチュアがやってる社内システムだけでしょ
Windowsのシステム構築運用を勉強しても、転職できない。
まず、勉強環境がないので、勉強できないし
バックエンドエンジニアがLinuxじゃなくて、
なぜWindowsを勉強したのですか? と聞かれても、返答に困る
クラウドの汎用的な技術じゃないから、雇われない。
CP932 とかWindowsはパソコン用で、ウェブ系ではないから、
ウェブ開発企業を渡り歩く事はできない
ウェブ系は、Linux, UTF-8 だから PowerShellの本を見たことないのは無知なだけだろw
Rubyを使うと時代に取り残されてこんな残念な生き物になってしまうという一例 社内ツールならクラシックASP(非.NET)が楽ちん
JavaScriptだけで済む >>530
数字だけじゃなくて、その内容も見るべき。
例えば、商品の価格だけで決めたら、低品質かも知れない
asp.net は、どういう香具師が使っているのか? とか
YouTube で有名な雑食系エンジニア・KENTA が本を出している
「21世紀最強の職業 Web系エンジニアになろう」
Microsoft 自体がLinux 技術者を採用して、Linux財団に属して開発している。
Docker と同じものを、Windows で作れなかったから、
あきらめて、Linuxを使ってクラウドをやる事にした KENTAが勧めてるだけでクソとわかるのはありがたいな >>532
君が部下で、サーバ選定の際にこんな「youtubeの受け売り」的な比較持ってこられたら、君をクビにして反動でWindoesサーバ使いを雇っちゃいそうだわ
情報が古いor間違ってるから、一度自分で調べてみろよ >>535
よく知らんけどおれは日々実務で試行錯誤してる膨大な人数のエンジニアを信用するよ でも、今の一流文化人の著者は、YouTube, Udemy ばっかり
Rails のKENTA, AWS のくろかわこうへい、
Python のキノコード、React のじゃけぇ
国会議員のガーシーも、YouTuber 一流文化人というより上っ面だけの人気取りなだけだろ
殆ど何も得るものはないぞ >>522を見るとPHP>>ASP>>その他って感じか
あとrubyが日本だけってのも面白いですね。やっぱ日本生まれってことで贔屓目になるもんなんでしょうか
色々参考になりました。ウェブの勉強始めるにあたってASPが悪くない選択肢だというのはわかりました 突然増えてると思ったらまたRubyキチガイが暴れていたのか
終わりそうなのを感じで焦っているのだろうな
早く現実を見ようや
Rubyは終わりました PHPが多いのはたぶんWPをカウントしてるからだろう 普通にサイト作るならasp.netは完全に除外されるだろう バックエンドは最初に.NETを検討する
あ、もちろんLinuxコンテナね Web系で在日外人の採用活動やってるけど最も得意とする言語をJavaScript/TypeScriptとしてる求職者が圧倒的に多く、第2言語としてはGoがそこそこ人気
時々ゴリゴリのエンタープライズ系の経歴でJavaとC#が得意ですというのもいるが落とす Web系で一番頭数必要なのはフロント側だしそりゃjs出来ない奴は落とされるやろ そういえば確かデジタル庁もバックエンドエンジニアとしてC#出来る奴募集してたな >>550
あの要件見て失敗するなと思った
asp.net三年以上経験のあるやつってそんなにいない
あの条件はエリートじゃなく仕事が嫌になって複数回転職した人の経歴
そんな要求してくるなんて馬鹿なんじゃないかと >>551
ゼロということはないし、実際特定の人を起用するための出来レースかもしれん
役所というのは面倒なところで「この人に頼みたい」と思っても勝手に頼めない仕組みになってるんだわ 経験なんか役にたたないんだわ
エリートの3ヶ月 >> 普通の3年
な感じ >>551
いやあれは結構よく考えてあるよ
開発者にはわからんかもしれんが ASP.NET MVC作るのクソ簡単だと思ったけどそうじゃないのか?
APIコントローラー作るのクソ楽だった System.Memory<T>について教えてください。
MemoryがSpanと相性が良いことや、ArraySegmentよりもパフォーマンスが良い理由はなんとなく分かりました。
ではこの場合、どっちの方が早くなるんでしょうか?
int[] array = new int[8]; // フィールドにint型配列を用意する
void Method(int index) {
///// Memory<int> memory = array.AsMemory(0, 8);
//// [1] array[index]を参照して操作
//// [2] memory.Span[index]から参照して操作
}
どういうケースなのかが重要だとは思うんですが、MemoryのSpanパイプ的な用途以外での使い道がなかなか見えてきません。
今回の場合はフィールドを見ていいので、Slice等を考えなければMemoryインスタンスへの参照を増やしているだけなんでしょうか?
array.AsMemory(0,2)くらいに範囲を絞ると高速になる、なんてことは無いんじゃないかなと思ってます。
ただ、これの検証をするのにも知識やスキルが足りなくて出来ていません。
ヒープを参照する場合はSpanであってもarray[int]の方が早いんでしょうか?
長文になってすみません。どうぞよろしくお願いします。 void Methodを非同期にする場合でも、フィールド変数を参照していいなら引数にMemoryを持つ必要性は無いのかな、という疑問から質問しました。 検証するスキルが無いなら、まだそんな事を気にする段階じゃないということだ
Benchmark.NETの使い方とアセンブリコード読の読み方学習してから出直してきて >>500
このアドバイスが一番原因に近かったわ
単にishitなんとかってプロパティを前任者がfalseにしててイベント自体発生してなかっただけだったよ
ありがとう! 知らなかったんだろ
偉そうにしたいなら最初に教えてあげたら良いのに >>563
こういうやつがいるから教えるのが素人だけになるんだよ お手軽マウンティングの1パターンだな。
解決策が見つかってから「それは最初に調べとけよ」「そんなことも知らなかったのかよ」etc. >>551
ASP.NETを使っているところは、なぜかC#の経験ばかりチェックするDQNプロジェクトばかり。
ASPのタグの編集経験を問うべきなのにw ロード中とかに使いそうなグルグルするアニメーション画像をピクチャーボックスに入れて、処理開始から終わりまで表示してグルグルさせたいんですけど、最後の完了のメッセージボックス出るまで映る事なく終わります。
メッセージボックス表示中でOKクリックするまではぐるぐるしてるんですがどうしたら出来ますか?
コードの流れはフォームからenter keyでスタートして別クラス行って処理して、戻ってきてメッセージボックス表示の流れなんですが。 なんか状況が判りにくいけど、メッセージボックスはモーダルダイアログだから
表示する事で処理が止まってたりしないかね
メッセージボックスじゃなくて、適当なフォームをShowした場合どうなる? ウィンドウメッセージとUIスレッドの関係でそうなってる
対処法は、マルチスレッドにしろ
ただし難易度は結構高い
まあ、あれだ、とりあえずDoEventsとか入れてもいいんだがな
DoEventsいれてちゃんと動くプログラムはそれはそれで結構難しい 変な癖が付きそうだし、今更DoEventsに手を出すべきではないと思う >>570
ProgressBarのMarqueeならMessageBox.Showしても止まらない
グルグルをどうしても動かしたいのなら>>571が理由だろうからメッセージボックスを自分で作ってモードレスフォームで表示するか、グルグルの方を別フォームで表示したら 別スレッドからlistbox.selectedindexとかのプロパティを取得するのわからん。
設定とかはデリゲート、インボークとかググったらなんぼでも出てくるけど取得は
出てこない。。 色々とありがとうございます。
簡単そうに見えて難しいんですね。 androidだとrunOnUiThreadなんてものもあるけど理屈は一緒だな
この辺意味が分からないなら多分やりたい事は出来ないw スパゲティの元だけども、
runOnUiThreadの方が関数の中に書けるから好き 外部アプリ(java)をC#から起動し、途中でprocess.killで強制終了することがあるのですが、問題はありますでしょうか。外部アプリがファイル操作中だったら開きっぱなしになるとか。問題があるとしたら、他に方法はありますでしょうか。よろしくお願いいたします その起動されるアプリによって問題があったりなかったりするとしか
ファイル書き込み中にkillしたらまあそのファイルは壊れるだろうね
アプリやOSによってもっと穏顕な終了のさせかたがあるからそれが使えるなら使えばいんじゃね >>582
ありがとうございます。
外部アプリには途中終了コマンドが無いのですが、windowsには何かありますか?ググっても分かりませんでした。外部アプリはウィンドウの無いコンソールアプリです >>583
kernel32のGenerateConsoleCtrlEventを使う。
アプリが対応していれば、穏便な終了処理をしてくれる。 Process.CloseMainWindowで大体は閉じれるんじゃね ありがとうございます。CloseMainWindowは表面的にはHasExitedがtrueになって処理が中止されたように見えるのです、タスクマネジャーで確認すると、閉じたはずのjavaアプリのプロセスが動き続けてCPU・メモリを占拠し続けてしまっていました。
GenerateConsoleCtrlEventはググってもC#、WPFでどう使うのか分からず、途方に暮れています、、、 WindowsでGUIアプリを操作するなら今はUI Automation一択 Javaのアプリってのがどういうのか分からんからコメントしようがないな
外部プロセスと通信する、または入力を受け取る仕組み用意してないならKillしかないんじゃね >>589
何で書かれてようがwindowがあればUI Automationで操作できる >>590
そういう話ではなく、終了させる方法がそもそも用意されてるのかって事 >>591
右上の✕印を押すとたいてい終了できるぞ >外部アプリには途中終了コマンドが無い
>外部アプリはウィンドウの無いコンソールアプリ
この外部アプリを途中終了できるように改修させる方が楽なんじゃね? >>587
GenerateConsoleCtrlEventのC#での使い方はStackOverflowの813086とか見るといいよ LibraryImport来たついでに逆アセしてみたけどWin32の戻り値BOOLをC#側でboolでDllImportしちゃうだけで大量のゴミコード生成される事になってたんだな
CのBOOLの実体はintでC#やC++のboolの実体はbyteだけど単に切り捨てられるだけかと思ってた
逆に引数と戻り値を完全に型サイズ合わせればLibraryImportだろうがDllImportだろうがインライン展開されて直接Win32呼ばれるってことか >>597
訂正
型サイズ合わせるじゃなくてBlittable型オンリーなら直接呼ばれるだった
型が合ってるかどうかはコンパイラ側からしたら知った事ではない話だった >>570
今更だけどSystem.Timers.TimerどころかSystem.Windows.Forms.Timer使ってコントロールの表示変えながらMessageBox.Showしても表示の変更止まらんな
Marquee動く時点でもしかしてと思って試したらそんな結果。DoEventもいらない
むしろ止まってしまうグルグルをどうやって動かしているのか不思議 Windows 11の標準アーカイバーも不便だし他に良いのもないから自分で作ろうと思って久々にプライベートで開発すっかなと思ったわけですよ
そんでMSのDoc読みながらふむふむPackage.appxmanifestにwindows.fileTypeAssociationなんかで記述すればWin11のNew Context Menuにコマンド追加できるわけね
おー確かにサンプルのApp1で開くが追加されたし.zipで右クリックしたら出た、じゃああとは汎用フォルダ・ファイルの右クリックではどうやるのかな?
はい、汎用フォルダ・ファイルへのコマンド追加はExplorerのShell拡張が必要です、そしてまーた.NETあるあるのVC++でCOM作ってくださいですよ
十何年前とまったく同じことを.NET 7になっても繰り返してんだねこれじゃMS StoreもデスクトップアプリもオワコンになってWindowsでアプリなんて増えるわけないよね
そりゃWSAとAmazon App StoreでAndroidアプリエミュレートするしかなくなるわな
なんでこんなデスクトップアプリを開発する場合に誰もがやりたがることがこんなに難解で面倒なんだよ.NETでAPI用意しろよアホすぎるわMS フォルダを対象にしたアプリってアホみたいに作れる
フォルダ指定してこれを○○で開くが無限に作れる
安易に出来たらアプリ100個入れたら100個縦に○○で開くが並ぶ
これ以上増えてもらっても困る
と言う感想 >>601みたいな奴が簡単にそういうOSに関連したコードを書けるほうが何が起こるか分からないし
OSの互換性が重要だし、その辺理解出来なくて発狂しているだけなら相当頭が悪い
で、シェルエクステンションの実装が出来ない低レベルは諦めたらいいだけw そんな酷い言い方はないと思うが…
なんだったらwin11は右クリックをカスタマイズできるツールは沢山あるからそれを使えばいいかとも思う
どうしても作りたいならOSSのツールもあるからそこからコピペするのもありかも >>601
C#でCOM作れるのにどうしてそういう感想になるんだw クライアントでのマスターデータの管理って皆さんどうやってますか?
・使用するたびにサーバーに取りに行く
・初めて使用したときにサーバーに取りに行きクライアントのメモリに保持しておく
・クライアント起動時に全部のマスターをサーバーに取りに行きクライアントのメモリに保持しておく サイズとか更新頻度と相談
正解はないが鯖でやった方がメンテしやすくていいんじゃないか >>607
レイヤーを下げて特定のAPIをクライアント側でキャッシュ 割と頻繁に更新され、即時性が要求されるなら都度読みにいくしかないし
通信環境が良くなくて通信回数減らすためになるべくキャッシュしたりする事もある
結局要件次第としか まあ要件次第なのはそうなので、要件を絞って
サイズが大きい
更新頻度が少ない
使用頻度が少ない
この場合はキャッシュするとして、その場合のキャッシュ方法って何がおすすめですかね?
マスターを使うときの実装としてはこんな感じを考えてる
更新されたかの確認
更新された場合、クライアントにダウンロードし、ついでにファイルに保存。
更新されてない場合、クライアントにファイルがあればそれをメモリに展開。
ファイルがなければ、更新された時と同様 >>611
なぜキャッシュしたいの?
マスター更新後に古くなったキャッシュが利用されても問題ない?
想定してる通信環境は?
サイズが大きいとは具体的に何MB程度?
想定してる用途はモバイルゲーム?業務アプリ? サイズが大きいってのもざっくりすぎてなぁ
富豪的にメモリ使えるなら全部メモリぶち込んでもいいし
一旦ローカルに置きたいなら、SQLiteでも使えば >>612
サイズは10MBくらい
業務アプリ想定
古いマスターが使われないように使う前に更新されたか確認するつもり
なんでキャッシュしたいかは使うたびに毎回通信してたら時間の無駄かなと 頻繁に更新チェックするくらいなら、都度取っても大差ない 何を聞きたいのかさっぱりわからん
マスター ⇒ クライアントのファイル ⇒ メモリー の2階層キャッシュなら
マスターの更新日時を取得
if(キャッシュファイル無し && キャッシュファイル更新日時 < マスターの更新日時){
マスターダウンロードしてキャッシュファイル更新(キャッシュファイルの更新日時を更新)
}
if(展開済みメモリー無し && メモリー更新日時 < キャッシュファイルの更新日時){
キャッシュファイルをメモリーに展開
メモリーの更新日時を更新
}
ってやるだけだろ つーか、>>611 まで考えてるなら実際に試してパフォーマンス計測してみりゃいいじゃない
それで想定通りのパフォーマンスになってるならそれでいいし
結局要件満たせてりゃいいのよ >>611
それだとオンラインで普通に処理して結果だけ貰うのが正解
ローカルに置くのは速度が最優先される場合
で速度が求められるのは使用頻度が高い機能
仕様頻度が低い機能にそんな変なことせんでいい そもそもローカルに置かなくていいように設計すべき
都度SQL投げるかサーバーサイドにAPI実装すりゃいいだろ >>614
マスターの全データじゃなく都度必要なデータだけサーバーから返すようにすれば通信時間とかは誤差の範囲だと思うよ
特に古いマスターのデータを絶対に使っちゃだめなユースケースの業務アプリならクライアント側にキャッシュするメリットはほぼない
どうしてもキャッシュするならサーバーから取得した部分的なデータだけキャッシュして基本はローカルチェックのみ
クライアント側でマスターデータを使って何かデータを作成/更新するときはマスターのバージョンを条件に入れておいて古い場合はエラーではじく(これは状況によってはキャッシュしてなくても必要な処理) まあPOSみたいに一時的な通信途絶が避けられないがマスターデータを使用する処理は続けなきゃいけない状況でローカルに持ちたいことはあるだろうな
そもそもそんなものを初心者に設計させるなという話だが 要件もよくわからんのにオレオレ設計語り出す奴がワラワラ湧いてきてて草 キャッシュが必要なケースなんて限定されてるから、
本当にキャッシュしなきゃいけないのかよく考えた方がいい
多少通信回数が増えようが、LANなら普通は問題にならん >>616
実装方法としてはそんな感じ
>>617
他の人がどんな感じで実装してるか気になったんだよね
会社の中で開発する人が少ないと周りの意見とか全然入ってこなくて…
>>618
ローカルに保持するデータの使い道は主にコンボボックスの候補とかオートコンプリート用
>>621
そのマスターが10個とかあったら数秒待たされたときがあって気になったんだよね >>625
候補として出すだけなら画面表示するときに必要なものだけ取ればいいだろ
それで10MBはさすがになんか間違ってるように感じる コンボ、オートコンプリートは最大件数を決めて切り捨て
そんでサーバー側で処理
ガチで全件検索したいなら別途、検索画面を作成
何がなんでもローカルに置きたいならイベントソースにして差分管理 >>625
やりたいこと、方針は間違ってない。
間違ってるのはここで質問してること。質問者の一切を否定しようとする奴ばかりだからね。 >>628
提案は出てるやん、あとどうするかは仕様と本人次第 VBA+Seleniumで自動ログイン機能を実装しています。
ログインすると
「パスワードを保存しますか?」というダイアログが表示されてしまって困っています。
ネットで調べて以下の様なコードを記述していますが、出ます。
Dim Driver As New Selenium.WebDriver
Driver.AddArgument "credentials_enable_service=False"
Driver.AddArgument "profile.password_manager_enabled=False"
記述が間違っているのでしょうか? RegexGenerator作ったんならQuerySelectorGeneratorも作ろうよ、MSさん デバッグで大事なのは最小構成でやることでしょうか?
余分な部分を排除して、小さなプログラムを作ってみることすか >>634
目的による、としか言いようがない気がするが
それだけだとアレなんで、多分メソッド単位でのテストとかを想定してそうなので
そういった単体テスト(ユニットテスト)はxUnitやMSTestなんかを利用して行うのが吉 >>634
大事なのはバグを確実に再現する手順を見つけること んで
確実に再現するには余計な状態が少ないほど簡単だね >>635
636
ありがとうございます
構成を小さくするのはユニットテストというんですね 別のプロジェクトを作って単体テストしてましたが、xunitというのを調べてみます C#を独学中の50過ぎのIT業界未経験のオッサンなんだが、
Pyhton3で、
f"{0b1000 >> 1:b}"
に相当するのって、もしかしてC#には無い?
$"{0b1000 >> 1:b}"
だとエラーになる。;xや:Xならいいみたいだけど。 数値書式指定文字列に2進数のはないねえ あっていいと思うんだけどね
Convert.ToString()で基数指定して2進数化と、あと必要に応じてPadLeft()でゼロ埋め >>641
Convert.ToString(num, 2) で出来ました。有難う御座います。
でも、C#って未だ何か中途半端ですね。折角 0b 表記が有るのに :b で書式指定出来ないなんて。 実は0bが書けるようになったのも割と最近だったりする 単体テストッテ別プロジェクトつくってやればいいだけじゃないんですか?
なんかしらのツールがいるんですかね 2進数を表示しようなんて思ったことないな
16進数で書いたほうが読みやすいだろ >50過ぎのIT業界未経験のオッサン
これで察しろ ああ課題か
そういうのは自分で2進数に直して進数の理解を深める練習だから楽したら意味ないぞ
そうでなくても残り時間が短いんだから最大限の効果が上がるようにしなきゃ >>647-648
別に課題でやってる訳ではないけど、Python3と同じ様に対応しているかと思ったらそうではなかったから気になったというだけ。
一応、自分で書いてみたよ。
もっとスマートな、君達プロが書いたコード例も見てみたいです。
static string IToB(int a) // Convert given integer value to bit pattern string and retern it
{
string lsb = ""; // for caching current LSB in string type
string b = ""; // for caching bit pattern in progress in string type
while (a != 0) {
lsb = (a & 01).ToString();
b = lsb + b;
a >>= 1;
}
return b; // Return converted result
} 違う言語でも同じことができると思ってるやつ一定数いるよな >>644
目的が達成できるのなら、どんなやり方しようが別にかまわないだろうが、xUnit等のテストフレームワークを
使った方がいろいろ便利で捗ると思うよ >>649
それ普通に-1与えたら無限ループしない? 長いことプログラムやるともうプログラム脳になる
引数にint 使ってあればマイナスや0のことを考慮してるのかどうか気になる
ビット演算 >> 見ればちゃんとマイナスを考慮してあるのか気になる
割り算があれば0除算しないか気になる
これが基本 >>652
本当だ。符号付きは、符号無しにタイプキャスティングしないと駄目みたいですね。
訂正バージョン
static string IToB(uint a) // Convert given unsigned integer value to bit pattern string and retern it
{
string lsb = ""; // for storing current LSB in string type
string b = ""; // for storing bit pattern in progress in string type
while (a != 0) {
lsb = (a & 01).ToString();
b = lsb + b;
a >>= 1;
}
return b; // Return converted result
} >>655
じゃあ、君ならどう書くの?
お手本を見せてください。 >>658
本当だ。御指摘有難う御座います。
if (a == 0)
return "0";
else {
…
return b;
}
にしないと駄目ですね。 変数名を変えるだけでもだいぶ読みやすくなるし、コメントがそもそも要らなくなる箇所だってある
// "{b}" 相当の2進数表記に変換する
static string FormatBinary(uint a)
{
string ret = "";
while (a != 0) {
string adder = (a & 01).ToString();
ret = adder + ret;
a >>= 1;
}
return ret;
} >>656
長い行コメントなのとやたら短い変数名は、学生までだからな。 >>659
例外処理を知らない人のアドバイスなんて無視していいよ。 ゼロという文字列が返されるなら、最低限、仕様のコメントくらい書いておいてほしい。
ただ、間違って呼び出し側がゼロを渡した場合にゼロが戻るというのも曲者だけどな。 >>649
IToBが何の略なのかまったくわからない >>654
コメントは上に書いた方がいいよ
しかも英語で書いている理由はなんなの? 「to」がもしかして英語の「to」じゃないというとんでも命名なのか? C#でI+大文字で始まるメソッド名は嫌だな
インターフェイスと紛らわしい >>665
今度から、上に書く様に癖付ける。
「40過ぎたら年齢差別の無い外資系以外は諦めろ!」 と言われたから、英語の勉強も兼ねて、出来るだけ英語を使うようにしている。
>>660 の 「// "{b}" 相当の2進数表記に変換する」
を英語で書くとしたら、
// Convert to binary expression format equivalent to f"{:b}" in Python3
とでもなるのかな。
>>664
>>667 の指摘の通り、itoa、atoiを真似た。C言語から入ったからね。 メソッドは常にレシーバを記述することが推奨されているからそれに従えば混同することはないでしょ >>669
これから英語やプログラムを学ぶ50過ぎの爺をどこの外資が雇うんだ?その発想からしてもう終わってるだろ 普通にConvert.ToStringを使えばいい
自作しなくちゃいけないならこう
public static string ToBinaryString(this uint source)
{
var length = sizeof(uint) * 8;
var result = new char[length].AsSpan();
for (int i = 1; i <= length; i++, source >>= 1)
{
result[^i] = (char)('0' + (source & 1));
}
return new string(result);
} >>669
他の言語の文化を持ち込むのはすげー嫌われるよ。 class A{
public int X {get;set;}
public void Modify() {if (X < 0) {X = 0;} return;}
public bool Check() {return (X > 10);}
}
class B{
var c = new A();
c.X = ・・・;
if(c.Modify().Check()){・・・}
}
このようにインスタンスメソッドを数珠つなぎみたいにしたいのですが、voidに「.」は使えないエラーが出ます。どのように直したらよいでしょうか。
c.Modify();
if(c.Check()){・・・}
というように分けて記述すればエラーは出ませんが、数珠つなぎにしたいです。
よろしくお願いします。 二進表記のstringに変換してるので不正確なんじゃない? >>674
3つ以上数珠繋ぎは基本的によくない
意味のある数珠繋ぎじゃないならそこで終わり >>676
public A Modify() {if (X < 0) {X = 0;} return this;}
でできました。ありがとうございます。
>>677
ありがとうございます。数珠つなぎが良くないのが分かりました。 >>675
もしかして二進数に変換すると数値になると思ってる?w 自分でやれや
俺はConvert.ToString使うから >>682
二進数の"フォーマット"に変換されると書いてあるけど実際は二進数フォーマットされたstringに変換されてる 仕様を考えてないあたりは、みんなただの初心者なんだろうな。 >>685
フォーマットに変換っていうのはそのようなフォーマットの文字列に変換ということだぞw 俺のコードにほんの少しだけ足せば前のゼロを消すことができるから初心者じゃないと思ってるやつは挑戦してみなよ
ヒントはSpanの長さ
0がコーナーケースだ
うわここまで言えば初心者でもできちゃうな
誰もできなかったらどうしようw 普通にConvert.ToStringを使えばいい
自作しなくちゃいけないならこう
public static string ToBinaryString(this uint source)
{
var length = sizeof(uint) * 8;
var result = new char[length].AsSpan();
for (int i = 1; i <= length; i++, source >>= 1)
{
result[^i] = (char)('0' + (source & 1));
}
return new string(result);
} >>647-648
別に課題でやってる訳ではないけど、Python3と同じ様に対応しているかと思ったらそうではなかったから気になったというだけ。
一応、自分で書いてみたよ。
もっとスマートな、君達プロが書いたコード例も見てみたいです。
static string IToB(int a) // Convert given integer value to bit pattern string and retern it
{
string lsb = ""; // for caching current LSB in string type
string b = ""; // for caching bit pattern in progress in string type
while (a != 0) {
lsb = (a & 01).ToString();
b = lsb + b;
a >>= 1;
}
return b; // Return converted result
} >>690 は2進数の文字列という意味だったのか
ちょっとあれでできると思ったのがわからない。 >>688
指摘されて顔真っ赤w
こんなレベルでマウント取りに来るとか恥ずかしすぎるだろ >>649
最初のこのコード
do whileと論理シフト>>>=に変えたら
結果だけなら、いい感じになりそうな気がする 引数のaの扱いが雑すぎて、言語仕様に詳しくない自分にはわからなかった。 負け犬の遠吠えしかできなくて草
こんな簡単なこともできないのか >>687
無駄に草をはやしてないでMSのドキュメントの英語版見てくるんだ
負け犬の遠吠えはいいからさあ Binary Stringの意味が2進数表記だと思う人がいるかな? 何勘違いしてんの?
// Convert to binary expression format equivalent to f"{:b}" in Python3
これだよこれ
英語おかしい >>665
今度から、上に書く様に癖付ける。
「40過ぎたら年齢差別の無い外資系以外は諦めろ!」 と言われたから、英語の勉強も兼ねて、出来るだけ英語を使うようにしている。
>>660 の 「// "{b}" 相当の2進数表記に変換する」
を英語で書くとしたら、
// Convert to binary expression format equivalent to f"{:b}" in Python3
とでもなるのかな。
>>664
>>667 の指摘の通り、itoa、atoiを真似た。C言語から入ったからね。 「Python3 の f"{:b}" に相当するバイナリ表現の形式に変換」と日本語にしてみても、元の日本語を直訳しているだけだな。 変数名を変えるだけでもだいぶ読みやすくなるし、コメントがそもそも要らなくなる箇所だってある
// "{b}" 相当の2進数表記に変換する
static string FormatBinary(uint a)
{
string ret = "";
while (a != 0) {
string adder = (a & 01).ToString();
ret = adder + ret;
a >>= 1;
}
return ret;
} >>703
この書き込みから、メソッドのコメントが変わったけど、これを他人が理解して、質問者がそのまま英語にする流れも変だな。 他人のレスをコピペするやつ、何がしたいん
めちゃくちゃ読みづらいんだけど >>696
コメントとコードから何をするかは明らかでMSは関係ないが英語もコードも読めないのなw 英文が間違ってると指摘したら何か悪いのか?
勝手に人のレスを引用してるのは俺じゃないぞ? >>707
読めないのはお前だろ
MSではちゃんとstringと書いてある
そこを無視すんなって
負け犬の遠吠えはやめろよw >>711
文盲は漢字などの文字を知らず読めない人のことだ
文意を取れない人間のことではない
なんでこいつみたいな文盲と言う煽りを使うやつは必ず間違って使うのかわからない
5ch見てる時点で文盲はありえないんだけど
文盲と言う言葉をあおりで使う人間の知能が低いと言うことだろう >>710
> MSではちゃんとstringと書いてある
書いちゃダメとは言わんけど書かなくてもわかるだろ やっぱり毎日張り付いてるアスペじゃないかw
C#知らんくせに口出すから恥をかくんだぞw binary expression formatは間違ってる
単にbinary expressionなら英語的には間違いではないが二項演算式の意味でもよく使われるから読む人間によっては分かりにくいこともある
//return the binary string for an integerとか
//Convert an integer to a string of its binary representationとか 二進数表記を文字列と知らなかったアスペはアホすぎるだけで一応スレチではないぞw >>718
そこをどう見たらそういう風に取れるのか謎だな
脳がおかしいとしか思えない >>718
バイナリリテラルは2進表記じゃないのか? 文字列リテラルだろ?w
二進数に変換するんだからソースコードの話じゃないわなw
アスペマジアスペ アウアウウー Sa5b
ワッチョイ 5707
ワッチョイ 775f
オイコラミネオ MMab
NGしたらスッキリ >>715
有難う御座います。
ベテラン勢からの、そういった有意義な添削を求めてます。
二項演算式ですか…
二項演算子の事を、binary operatorって記述してるのば良く見るのですが、二項演算式って初めて聞きました。 例えば 10 と書くと十ではなく、三というプログラミング言語があるのか? 010 と書くと十進数の 8 になる言語なら知ってる >>722
そりゃそうだろうなw
恥をかいたら暴れるんじゃな反省するだけにするのが一番いいと思うぞw >>723
それベテランじゃなくただのアスペだが自演か?w >>692
>>>演算子は、C#10以降でサポートされているみたいですね。
https://stackoverflow.com/questions/1880172/equivalent-of-java-triple-shift-operator-in-c
PCに、C#10迄しかインストールしてなかったのと、C#10迄にしか対応してないチュートリアルを見てた為、気付きませんでした。
某陶芸家のオッサンみたいに、嘘でも 「現役女子高生」 とか名乗っていれば、もっと暖かく迎え入れて貰えたのかな… >>830
> >>>演算子は、C#10以降でサポートされているみたいですね。
C#11以降の間違いです。 >>732
自演は一切してないから
どうしてそういう考え方しか出来ないのかなぁ…
>>699 や >>690 のコピペ荒らしは、誰か知らないけど自分じゃないから
学校の課題をネットで聞いたり、ネットでの入社試験を替え玉受験するってのはZ世代特有の発想なのかな
因みに、学部三年の時の必修科目で出題された課題がこれ
https://i.imgur.com/h0bNQdo.jpeg
で、選択科目の初回の授業の時に、先生が黒板に2次方程式 ax^2 + bx + c = 0, a≠0 の一般解 「x = (-b ± √(b^2 - 4ac) / (2a), a≠0」 を書き、
「20分でこれが解けたら前期の単位をやる。言語は問わない。」と出題し、誰も解けなかった問題とその解説。
今ではWikipediaに正解が書かれてるが、当時は市販のプログラミング入門書でも間違っていたのが多かった。
https://i.imgur.com/2dO2vuf.jpeg
で、年齢は大体これで察しろ
https://i.imgur.com/aOQE29f.jpeg 50歳にもなってこれから英語とプログラミングを勉強して外資に勤められると勘違いしてる馬鹿 今に「外資系の企業と契約して働いてます」とか言い出してUber Eatsと書いてあるリュックを担いでそう さすがに1970年代の技術は1990年代では使われてないだろう >>733
自演でスレチで発狂とかはたから見たら惨めでしかないからいい加減やめとけw >>733
50歳なのに専門職じゃないのか。
他の業種にいて、最近、プログラマになろうとした無職か。 50歳なら早期退職を勧められる人さえ珍しくない世代だな 早期退職は1700-3000万くらいいきなり入るから結構
おいしいけどな。
ハローワークに登録だけして速度決まるとまた追加で100万近くもらえるっしょ。
給与さがったらさらに追加でお金もらえるしね。 早期退職って要は無用の高齢社員へのクビ宣告だろ
退職金ちょっと割増しするのではよ辞めろと追い出されるだけだぞ 早期退職の場所は普通の退職金の2倍くらいの額はでるよ。
3倍近いことすら珍しくない。
グループ全員600名早期退職とかもあるからね。 Activator.CreateComInstanceFromって.NET Frameworkにあったけど.NET 6だと消えてる…?
もしかして.NET 6ではターゲットをWindowsにしてもComオブジェクト生成できない? COMオブジェクトの生成自体は
Type.GetTypeFromProgIDとかType.GetTypeFromCLSIDとかでType手に入れて
Activator.CreateInstanceで作れるはずだけど
CreateComInstanceFromを使ったことはないので同じことができるかどうかは分からん >>751
それがあったかサンキュー
最近 .NETもLinuxばっかりでWindowsの記憶が飛んでるわ 構造体かクラスをバイト配列に、バイト境界関係無くコピーする方法ってあります?
struct Test{
int a;
byte b;
}
int ans = Marshal.SizeOf<Test>(); // 8Byteになる 共用体使えばいんじゃね
使わない場合unsafeにせざるを得ないと思う 対象構造体が値型onlyなら.NET Frameworkみたいな古いシステムでも簡単に出来る
var test = new Test();
int size = Marshal.SizeOf<Test>();
var bytes = new byte[size];
fixed (byte* p = &bytes[0]) *(Test*)p = test; 自アプリ以外のフォームの移動とリサイズ中かどうかを知るすべはありますか?
自アプリなら開始と終了をメッセージで受け取れるんですが。。。 何を目的としてそれを知りたいのか分からんけど、ウィンドウハンドルを取得してAPI経由でどうにかするんじゃないかな?
やったことないから知らんけど メッセージフックと言うものがあるんだけど
そういう質問してくるレベルの人向けのものじゃないんだなあ C#だとキーボード以外のグローバルフックは出来なかった記憶が
CかC++でフックDLL作らないとダメだな Seleniumでサイトにログインすると
「パスワードを保存しますか?」って出ます。
これが邪魔で消す為にこのコードを記述していますが
出続けます。
コード間違っていますか???
options.AddUserProfilePreference("credentials_enable_service", false);
options.AddUserProfilePreference("profile.password_manager_enabled", false); https://teratail.com/questions/352199
複数オプションの追加については
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option('prefs', prefs)
options.add_experimental_option('example', example)
などと、連立させるで複数のオプションの追加が可能です。
またその他の解決策としては
options.add_argument('--incognito')
とする事でシークレットモードでの起動が可能となりパスワードマネージャーが立ち上がらなくなります。 >>765 >>766
ありがとうございます。
試してみます!
なぜかSeleniumを操作するプログラムを開設してるブログは、Pythonばかり、、、 そもそも C# では、 この様な記述は出来ませんでした。
ぐぐっても C# + Seleniumでパスワードマネージャーを非表示にする方法を解説しているブログがヒットしないです、、、
options.add_experimental_option >>767
ワシはSelenium使わなくてもスクレイピングできる方法見つけたけどな
https://youtu.be/2Alb4gpe6vw
C#のGUIコンポーネントのWebViewにJavaScriptをそのまま書けるからSeleniumとかわらん SeleniumもJavaScript使うようになってるから一緒 >>772
なんだそれ?
普通にブラウザの中だけど
てかSeleniumもそうじゃね?
ブラウザ動かすやつだろこれ? >>770
いろいろ試してSeleniumが便利だから使ってます。
ただ、パスワードマネージャーが出てうざい、、、 >>774
Seleniumは開発する時はデスクトップ
運用開始したらdockerで動かしてる >>744
地図が読めない、東西南北もわからない、住所の表記の意味がわからない、ナビゲーションがないとまったくわからないレベルもいるし、複雑な複合施設と兼用のタワーマンションなんて経験がないと出入りもできない。 >>744
ウーバーイーツはどこでも配達するので、山の中でも経験なしで配達できると思うのか?
そういうやつは何事も経験が大事ということがわかっていないので、むしろ経験がなさすぎて使えない。 と>>733が主張してます
やっぱりUbakaかよwww Ruby on Rails ではデフォルトで、
Selenium Webdriver, Capybara で統合テストする 同一レスに必要もないのに複数レスつける奴はアホの法則
かなりの確率で当たる パスワードはもう諦めました。
SeleniumでProfile1が起動している状態で別サイトを開いた場合、
Profile1のブラウザを閉じるには、Process Killの強引な方法しかないのでしょうか? 人に聞かなきゃ出来ないレベルならスクレイピングなんかに手を出すなよ
サイトに迷惑だわ >>786
本性が出た
こいつVBAで書いてた奴だろ 640,642,649,654,656,659,669,723,730,730,733
以外の書き込みは、全てアスペの第三者による成りすましです。
>>758
何をやりたいのか(ソシャゲのオートプレイ?RMT?最近流行りのRPA?)は分かりませんが、
以前、Adobe Flashアプリの自動ログイン・自動クリック等をUWSCやAutoItX.dll+WSH等で書いてましたが、
C#からAutoItX.dllを呼び出せば、簡単に出来そうだと思います。 >>793
初心者のスクレイピングはサイトに迷惑かけるって言ってんだろ
テストの仕方も知らねぇからデバッグ中もターゲットサイトに向けてアクセスするし、バグが取れるまでぶん回す
そんなのが複数いるせいでサーバ増強しなくちゃいけなくなる
まぁ、Selenium使ってアクセスしてくるようなやつには微妙に間違ったデータ渡したりして追い出すんだけど、その開発にも金かかる
お前が補填するのか? Udemy の山浦 清透の動画
【作業工程フル公開】エンジニアが30万円案件の制作過程を公開
www.youtube.com/watch?v=tYbVl6N8oxI
山浦ぐらいのプロ中のプロでも、
マイナビ求人サイトに、1:5:42 の所で無限ループしている
プロでも、サイトに対して無限アクセスしてしまうのだから、
素人のスクレイピングなどは、以ての外
ちゃんとサイトと契約して、API を使え。
勝手にスクレイピングするな >>794
お前が、初心者のアクセスも跳ねのけられない程度のスキルだって事だよ。
そのレベルでサイト作ってたらクラックされるぞwww >>788
おまえ、こんなのにスクレイピングさせようとしてたんだぜ
反省しろ スクレイピング対象のサーバによってはガチの損害賠償食らうケースもあるんで、自分で調べて出来るスキル無いなら手出さん方がいいと思うわ スクレイピングミスのF5攻撃でサイトダウンさせて業務妨害罪で逮捕 多重継承しない(その可能性もない)インターフェースって意味があるんすかね? つか別に多重継承が目的のものではないし
メインは抽象化だろ 作ったらそれっきりのものを自分一人で作ってるのなら好きにすればいいんじゃね? >>790
C#しか出来ない人には優しいかもしれんが、
多言語使いには喧嘩を売りまくってるじゃないか >>808
でも優しくね?
イキってるやつには否定から入るけど >>809
イキってるのはお前だろ
質問せず自分で解決できるようになってからイキれや 2,3年前まではC#メインにいじってたつもりなんですが、
いつの間にかここ1年以上なんかPHPやらJSやらばかりになってしまいました
昔の自分に戻りたいのですがどうすればいいですか。世の中から他の言語駆逐したいです >>814
時代遅れの巨人の力が通用するのはあと僅かです
今すぐ行動に移りましょう
まずは同士を募るのが良いでしょう
ソロで勝てるほど甘くはありません >>814
C#をメインで使ってる自社サービス系の会社は結構あるから探して転職したらいい
ある程度大きいとこだったらC#得意なら誰でもウェルカム状態だからよほどのバカかコミュ症でなけりゃ受かる ChatGPTにはふわっと返されました(´・ω・`)
.NET10くらいには戻ってこれてると良いな
↓ChatGPTさん
そうですか。私もC#が好きでしたが、今はPHPやJSが多く使われています。
まずは、自分が何をしたいのか、どのような目標を持っているのかを考えましょう。もし、自分がC#を使いたいという目標を持っているなら、それに向けて学習を続けることが大切です。
そのためには、最新のC#のバージョンを知っておくことが重要です。また、自分が興味を持っている分野に特化した学習をすることも有効です。例えば、ゲーム開発やWeb開発などに特化したC#の勉強をするとよいでしょう。
また、オンラインでC#のコースや動画講座などを活用することで、自分の学習スキルを高めることができます。実際にプログラムを書いて実践的なスキルを身につけることも大切です。
また、C#を使うプロジェクトに参加することで、実践的なスキルを身につけることができます。また、C#を使っている人たちと交流を持ち、自分の知識を拡げることもできます。
自分がC#を使いたいという目標を持ち、それに向けて努力することが大切です。他の言語を駆逐することではなく、自分が好きな言語を使い、それを使いこなすことが重要です。 今はC#と言えばほぼUnityという感じだしなぁ
昔はWindowsアプリの開発何かも多かったけど
ネイティブアプリはelectronとかそういうのに置き換わっている印象があるし
そうでなくても結局webの技術で作られたものがかなり増えたな
C#もASP.NETとかあるにはあるけど、そういうのって採用している所が結構狭い世界という感じ ネイティブそんなElectron使うか?
あれ見た目めっちゃめんどくさそう(つついたことない)
ワークスペースがどうとかウゼェよな
だからVScも使わんしSiki(5chブラウザ)も使わん SikiとVSCodeは普通に使ってる
他にいいソフト無いしな VSC → プロ用途
VS → 素人・セミプロ用途 今頃、PHP に参入しているのは素人でしょ
既に、YouTube で有名な雑食系エンジニア・KENTA は、
PHP, Scala, EC2 などをオワコン認定した
だから、PHPのFacebook とか、Laravel を使っているZOZO、
Scalaを使っているTwitter などは、良い開発者を集めるのが大変。
EC2 も、Fargate に変わった
一方、KENTAは、Ruby をオワコン認定しなかった
例えば、ガーシーが使うような、Mastodon もPHPからRails 6 に変わった。
作者のドイツのオイゲン・ロホコでも、PHPでは可読性が悪くて開発できない >>821
VSc使いづらすぎる
Sikiも使いづらすぎてJaneに戻ったわ SDKだけ渡しても( ゚д゚)ー?って涎垂らして固まるので
非エンジニア用に最低現のコードだけ書けば動くバカチョンな状態にしてあげたのがVSとそのコード
因みにガチのプロがVSCで作ったコードはVSでは動かせない
オワタ\(^o^)/チーン なんでc#のプログラマってthisを書かんのですか? >>828
Visual Studioが書かなくていいと言うから 初心者のアクセスも防げない低レベルが開発したWEBサイトの脆弱性といったら( ゚Д゚) 関数の引数と同名のプロパティならthis書かないと判別付かないけど
そうじゃない場合はいらないというのは良いのか悪いのか・・・ >>828
おれも不思議に思ってる
>>829 の言うとおりだと思うけど、そもそも論として >>831 の言うように何が良くて VS が省略をすすめるのかわからん そもそもthisつけないと分からないような変数名を付けること自体ほとんどないような 命名センスが無いかクラス設計がヘタクソなんでしょ
そもそも5文字(ピリオド含)も打ち込むのダルくない?アンダースコアでいいじゃん
MSお墨付きになったから組織内規約としても浸透させやすいし 変数名にメンバであることを示す目印を入れるのが良いってことですか? 会社とかでコーディングルールが決められているならば、それに従うしかないが
個人的な開発とかで自由にできるのなら、.NETランタイムの規約に準拠しておくのが無難だわな
github.com/dotnet/runtime/blob/main/docs/coding-guidelines/coding-style.md m_hoge は良く観掛けるが別に付けなくていい時に付ける必要もない
this.hoge 描くのが嫌なら
メンバ名 this_hoge ってしとけば良いよ base.inheritClass.this_hoge まあC#のメンバーは他の言語と違って大文字から始まるパスカルケース推奨でローカル変数は小文字で始めるのが推奨だからthisが必要になることはほとんどないからな
どっちも小文字から始めるなら不要なバグ混入を防ぐために必ずthis書いとけってのはわかる >>840
privateのメンバー変数は小文字だろ 区別っていうか、インスタンスにアクセスしてる気分出すためにthisつけたくならんかね? フォームの AutoScroll を true に設定したときに現れるスクロールバーなんですが、
つまみをドラッグしたときは、離すまで中のコントロールの表示が更新されません。
つまみを動かしながら中身も連動して表示してほしいんですが、どうすればいいんでしょうか。
ぐぐっても2つ以上のスクロールバーを同期させるような話題ばっかりがヒットするんですが、
難しいんでしょうか。 >>847
詳しく試してないがRichTextBoxやDataGridViewでは再現せずPictureBox(のImage)で再現して、フォームと言うかたぶんパネルとかのコンテナコントロール上でも起こる気がする
そして頑張って何とかしたらスクロールバーの反応が悪くなるとかロクでもないことになりそうな気もするw
ImageだけならIrfanViewとかのようにマウスドラッグでスクロールしたほうが分かりやすいので個人的には気にしない 普通は、無駄な描画を抑えるために、
つまみを放したタイミングで、再描画される
それを、つまみの値が変化するたびに、再描画すれば良い 皆様どうされているか教えていただきたいです。
Visual C# 2022
.Net6.0 で開発を行っております。
プロジェクトのプロパティ内で、
「ビルド」に「コードの最適化」という項目がありますが、
実際に運用する場合は、
最適化されたコードで運用していくと思うので、
デバッグをする際にも「コードの最適化」のチェックをONにして
ビルドを行い、デバッグをしていったほうが良いのではないかと思っています。
皆様は、デバッグする際にも「コードの最適化」のチェックをONにされていますか?
よろしくお願いします。 コンパイル時間が気にならないならそうしたらいいんじゃね >>850
> デバッグをする際にも「コードの最適化」のチェックをONにして
> ビルドを行い、デバッグをしていったほうが良いのではないかと思っています。
そう思うなら1回やってみ
てか、まずは自分でやってみる癖つけないと伸びないぞ C#の最適化は可愛いレベルだからそこまで気にしなくてもとは思う
c++なんて最適化のレベルを上げるとmemset()でメモリクリアしようとしても勝手にmemset()自体が消されてしまう
しかもその判定がおかしい
これは最適化なのかどうかすら怪しい
セキュリティ上問題ある場合は特定の命令を使って消さなければならないとか普通じゃない >>853
> しかもその判定がおかしい
それお前のコードがおかしいだけだろ... あまりにもクソコードの場合、中間言語をILSpyで逆コンパイルしたほうが見やすくなるしね >>848
わざわざ試してもらってありがとうございます。
ドボンにも項目がなさそうなところを見ると、ひとまず無理ということでしょうかね。
>>849
Delphi なんかだと、Tracking ってプロパティがあって制御できるようになってるんですがね。
そもそも無理のない配置にするなどして、あまりそういったデザインにはしないんでしょうかね。
必須の動作というわけでもないので、デザインの変更も含めてもう少し検討してみようと思います。 開発では最適化しない。
最適化されたら、break point の所のコードが、最適化されてなくなってしまうかもw
デバッグ中に、コードも変更できないだろうし 習得速度が遅いのだがどうしたらいいの(´;ω;`)
頭悪いからね
unityだけどね(´;ω;`) >>850
Visual Studioのデバッガ機能(デバッグありで実行)を使ってみればすぐわかるんだが
1行ずつ実行したり変数の内容見れたりする機能がある。
最適化されると処理の順番が入れ替わるわ変数がそもそも消えるわでデバッガが使い物にならんくなる >>859
マジレスすると、コツをつかむまではひたすら頑張るしかしょうがない。
いい師匠に巡り合えるといいんだが、理解するときのイメージって人それぞれなんで
難しいね。 847 ですが、英語情報あたったらありました。
Form の Load とかで
Scroll += From1_Scroll;
としておいて、
private void From1_Scroll(object sender, ScrollEventArgs e)
{
if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll)
{
HorizontalScroll.Value = e.NewValue;
}
else if (e.ScrollOrientation == ScrollOrientation.VerticalScroll)
{
VerticalScroll.Value = e.NewValue;
}
}
でそれらしい動きになる。
これぐらいの情報ならドボンにあってもよさそうなのにな。 >852
>860
アドバイスありがとうございます。
実際にやってみます。
>てか、まずは自分でやってみる癖つけないと伸びないぞ
身に染みるお言葉ありがとうございます。 >>861
はい、1日1つの課題くらいを作って、地道にやります
完成を目指します >>857
前提が間違っていて試した意味がなかったようだ、申し訳ない
RichTextBoxやDataGridViewはコントロールでスクロールバーを持っていて移動が即反映され、PictureBoxはスクロールバーを持っていないのでフォームのスクロールバーに依存するだけだった
>>862
有用な情報乙 On.NETってすげぇよな
Udemyレベルの教材がタダだぞ
今You Tubeの翻訳機能死んでるから治ったら見る >>867
たまに見てる
RegexMatchソフト使ってるよ >>867
だって検索してると出てくるし、よくまとまってるんだもんよ。
なんかいかんの? 今となっては古い方法ばかり充実しててもなぁ
全部が全部古い(もっと新しい方法がある)訳じゃないけど、初心者にはその見極めが出来ないから勧めない方が良い ネット上の情報も、更新日の新しいものだったらいいかっていうと、古いものを孫引きしてるだけだったりすることもあるからなぁ 正直なところ個人的には、初心者はネット上で済まさずにちゃんと本買った方が良いと思う
なんていうと、どの本がいいのかでまたひと悶着だがw 第5版出たとこだし独習C#でいいんじゃね?
プログラミング自体初心者なら新・標準プログラマーズライブラリも悪くないと思う
どっちも細かい部分で説明気になる所はあるが 難しい本だな
個人的には作って覚える系の本がいいと思う
unityでゲームみたいな本の方がやる気が出るんじゃないだろうか? 最初の一冊は基本概念と用語定義の正確性に特化した体系的な学習ができるやつがいいと思う
それが身につけば、ネットの記事も参考にできるようになるからな(参考にして良いいかどうかが判断できるようになる)
俺は独習C#使った
それなりに良かったと思うよ >>866
On,NETって、もしかして
https://www.youtube.com/watch?v=00enYc3V84A&list=PLdo4fOcmZ0oVlZCosDDwS9fkVtrLYxGt6
の事?
チラッと冒頭だけ動画見てみたが、機械翻訳が必要な程難しい表現は無かったけど。
YouTubeで自動音声認識で文字起こしされたものを機械翻訳したのは、音声認識の段階で高確率で間違ってるから、余計分からなくなるだけ。
慣れない内は難しいかもしれないが、これくらいの英語なら、翻訳無しで聞き取れるだろ。
「ファスタボー」 → 「first of all」
「レイボー」 → 「label」
「ウィーガナトーカバウッ」 → 「we are going to talk about」
みたいに、カタカナ英語ばかり聞いてると、最初の内は聞き取るのが難しいとは思うけどな。
Apple公式サイトの動画なら、ちゃんと字幕起こしされてるから、そういうので英語字幕を表示させて英語のまま直接聞き取る練習はした方がいい。 横からだけど独習C#、幸いにも近くの図書館にあったから読んでくる
ありがとう アルゴリズムは頭の中だけでなく、視覚化が必要ですか?
頭がぐちゃぐちゃになるんすよ
フローチャートみたいなのは少し苦手なんですが 俺はコーディングする前はいつも流れを文章化して書き出してる
白紙に文字と矢印だけの簡易フローチャートみたいな感じ データ構造じゃなくフローの話をしてるなら普通に関数分けしながら頭を整理すればいいじゃん
ローカル関数を使えば簡単に論理ツリーが構築できるからアイデアプロセッサ的な使い方もできる んー、じゃあ全ての機能を関数化して名前や役割を与える、ということですか?
それが図と似たようなものと 処理のまとまりとはっきり認識できるものは名前をつけるべき
他の人や数年後の自分のためにいちいち図を残しとくわけにはいかんだろ ループを書くときも外側から順に書くやつ多いよな
あれは一番内側から書くんだよ
その処理を行うにはどういう情報が必要かを整理してそれを引数にする
処理をした結果どういう出力が欲しいのかを整理してそれを戻り値(必要ならタプル)とする
そうすれば関数が一つできあがる
あとはその関数に引数を与えて呼び出すだけだからループなりLINQなりメモ化再帰なり木探索なり好きなのを選べばいい 今どきはコメント書けば適当なループ処理までAIが補完してくれるぞ >>890
そもそもそんな行き当たりばったりでコード書いてる時点で目糞鼻糞じゃない?
関数なんて最初に名前と入出力を決めたら中身は自ずと決まる >>892
お前FizzBuzzを関数分けせず書くタイプだろ
後で修正が必要になったら全部読んでごっそり書き換えるわけだ
今は構造化のし方を書いてるがそれを設計段階でやるか実装時にやるかはその時の状況次第だ
アジャイルだとざっくり設計なんてザラにある 関数分けという発想で行くと間違うというのはある
必要なもの集めて組み立てる感じ FizzBuzzを関数に分けたりしたら、文字数が増えちゃうじゃん 文字数増えて何の問題がある?
全部mainに突っ込むのを効率化と思ってるやつもいるがそんなもの計算量の少ないアルゴリズムを選んだら軽く吹っ飛ぶぞ >>883
ズバリ答えましょう
アルゴリズム実装に必要なものはユニットテストです ReactiveXでFizzBuzz作りたい
3が流れてきたらFizzって言うsubscribeと5が流れてきたらBuzzっていうsubscribeと15が流れてきたらFizzBuzzっていうsubscribeをつくって1から100に順に上がっていくオブザーバブルプロパティを作って発行し合う >>892
逆
入出力さえ正しいっぽければ中身なんてどうだっていい
それゆえのAIブームでもある >>897
ユニットテストとは、全部関数化するということですか? たけのこなんとかってYou Tubeチャンネル再生数少ないけどかなりためになるよな
https://youtube.com/@user-el9do7sq8l アマゾン見たらmaui本が1月14日発売だけど、年末出版には間に合わんかったんか?年明けは勉強時間取れる人少ないと思うが。 mauiに興味を持てるのはごく一部の異端者だけだからどちらでもいいだろ WinFormsにだけ注力してりゃいいのにバカなMicrosoft それはないけど同じところをずっと行ったり来たりしてるね
10年ぐらい停滞しっぱなし
net frameworkを.net coreに書き直し
winforms WPFを.net core用に書き直し
対応するためにVSを書き直し
reunionしてUWPのAPIを使うために書き直し
xamarinをMAUIにして書き直し
今後monoも置き換えするんだろうけど結局停滞してるだけでとてつもない開発リソースを浪費してる 停滞してるか?
めちゃくちゃ便利になってるんだが…。 停滞してるのはエコシステムではなく勉強してない自分達だったというオチはこの業界ではよくある話
身近なC#ディスりおじさんに詳しく話を聞いたらC# 1.0〜2.0ぐらいの知識で止まってたなんてことがよくあった
まあこれに関してはJava 7の印象でいまだにJavaが大嫌いな自分にも当てはまるんであまり言えんけど 便利になったのはWPFまでだな
それ以降のUIが迷走を続けている
MAUIはあの完成度でよくリリースする気になったもんだと思うわ 迷走だよ
GPSやセンサー類のAPIはUWPにだけ実装とか迷走だろ
それを今統合も出来ずに上位にWinUI3のガワだけかぶせてる
実質WinUI3はWPFの部分をwin32とか使ってc++で置き直してUWPを中に含めてるだけ 非GUI部分のAPIをUWPやwinformsやWPFから切り離せていなかったのが一番の問題 そしてその問題をWindows App SDKで解決したと var rst = src.Select(c =>
if(c == 'a') c = '1';
else if(c == 'b') c = '2';
else {そのまま}
);
とある文字列に対してSelectで条件分岐の操作ってできるんでしょうか?
このような操作はエラー出てしまいます。
for文使う意外でLinqで可能ですか? var rst = src.Select(c => {
if(c == 'a') c = '1';
else if(c == 'b') c = '2';
else {そのまま}
}); Selectは、 TResult Func(TSource c); 相当の関数を求めてる。
1文で書けないラムダは{}で囲ってreturnする必要がある。
var rst = src.Select(c => {
if(c == 'a') return '1';
else if(c == 'b') return '2';
else {return c;}
});
条件がそこそこ複雑になるから関数化した方が読みやすくなるけどね
static char func(char c){
if(c == 'a') return '1';
else if(c == 'b') return '2';
else {return c;}
}
var rst = src.Select(func); お前ら大丈夫か?
落ち着け
とある文字列と書いてあるのを意図的に無視してんのか? 追加情報
三項演算子を二回使うと二回分の変換を式で表せる
c++なんかでは多用されるテクニック
実際に使うとなると
string.Replace ごめんごめん
すげーまちがえてんな
3項演算子二重で使って3つの値を出せる式になる
それと古のテクニックを使う方法もあるけどもう寝る時間だな… お前こそ落ち着けよ...
とある文字列 = src
だろ >>918-924
こんな感じかな?知らんけど
string src = "beef steak";
var rst = src.Select(c => c == 'a' ? '1' : (c == 'b' ? '2' : c)); string rst = src;
rst = rst.Replace('a', '1').Replace('b', '2');
でもええんちゃう?知らんけど 今風に書くなら
var rst = src.Select(c => c switch {
'a' => '1',
'b' => '2',
_ => c,
});
としておきたいかな 多重に三項演算子使うぐらいならswitch式の方がマシじゃね?
var rst = src.Select(c => c switch{ 'a' => '1', 'b' => '2', _ => c }); 皆様分かりにくい質問だったのにありがとうございます😭 もちろんReplaceでいいんですけどSelectの理解のために知りたかったです
>>920分かりやすかったです。 文と式の区別ついてないしelseだけ変なブロックついてるけどなw MSストアアプリをリリースしてみたいけど難読化できるか気になっている。
中間言語(IL)のコードだと簡単にリバースエンジニアリングされてしまいそうで不安。
ストアアプリは中間言語ではないファイルにストア側で変換されますか?
自分で書くコードはC#です。
あと.NET7だとネイティブでビルドできるらしいけど.NET7で開発すると、
ローカルもストアアプリもネイティブコードで生成されるんでしょうか? >>939
難易度がけた違いでしょう?
機械語からリーバスエンジニアリングできるような人なら
ゼロから自分で書いたほうが速いはず。
ILだとC#初心者でもロジック理解できちゃうしパクリアプリも作られてしまう。 どうせ完璧な対策は無理だし、ConfuserEXで強めに難読化しておくのじゃ駄目かな C#のバイナリは中身もMSILだし難読化してもある程度ソースは分かる
ILSpy等で難読化した後のファイルを見てみれば分かるよ >>943
Regex.Replaceのオーバーロードにラムダ式を取るやつがあるから引数をキーにしてDictionaryから置換先を取り出せばいい >>938
今のところネイティブコード作れるのはコンソールだけってのをどっかで見た記憶がある
違ってたらごめん >>942
ストアアプリも読める?読めたらまずくない? 半分自己解決。UWPはnative codeになるようだ
非UWPはまだわからん。
.NET nativeのおかげだな。.NET7では全アプリ対応になってるのかも
https://microsoft.github.io/react-native-windows/docs/native-code
UWP apps written in C# or other managed languages submitted to the store must be built using the .NET Native toolchain. This is the default when building C# apps in Release mode, but not in Debug, so apps built in Debug will be rejected by the Store. native codeじゃないと商用アプリリリースする気にならないわ
認証まわりとかコード見られたくない
.NET7でもしWPFとかもnative codeふつうにはけるのなら
c#人気復活する気がする >>948
visual studioで空のUWPプロジェクト作って
releaseで.NETネイティブツールチェインをオンにして生成されたApp1.exeをILSpyで見ても
普通に中身見れるなw >>942
難読化を強い設定にしたらILSpyでファイルを開いただけじゃソースコードは読めないよ >>952
MSのストア側でnativeになるとかじゃない? C言語でボードゲームを作成する課題についてです。重力付き4目並べを最終的にコンピュータと対戦可能にするように、テンプレートのコードに穴埋めしていく課題です。
@横7x縦6の盤面を立てて使用A2人で対戦、以下の0~6のマスを交互に選択B縦横斜めいずれか4コマ並べれば勝ち。以下はテンプレートのコードです(長いので続きはGoogleドライブにも置いてます)、これらの空白部分の穴埋めが分かる方、どうか教えてくださいお願いします。元テンプレコード↓→ https://drive.google.com/file/d/1bTnbssantyf9dEV5DOugZuloiVUh7H3D/view?usp=share_link
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define YMAX 6 // 縦方向のマス目の数
#define XMAX 7 // 横方向のマス目の数
int board[XMAX][YMAX]; // 0:未着手 1:先手のコマ● 2:後手のコマ○
int num[XMAX]; // 各列に置かれているコマの数
int choice = 1; // 0:未選択
// 1:人間(先手●)対人間(後手〇)
// 2:人間(先手●)対コンピュータ(後手〇)
// 3:コンピュータ(先手●)対人間(後手〇)
int turn = 0; // 先手か後手かを判定するための着手数
void InitBoard(void);
void DispBoard(void);
int CheckFull(void);
int SetXpos(int);
int CheckBoard(int, int, int);
int ComputeXpos(int);
int SearchConnect(int, int);
int main(void)
{
int xpos; // 入力したコマの置き場所,またはコンピュータが探したコマの置き場所
int player; // 1:先手の手番 2:後手の手番
int win = 0; // 0:プレイ中 1:先手の勝ち 2:後手の勝ち 3:引き分け
int ans;
while (1)
{
srand((unsigned int)time(NULL)); // 乱数を使う場合のseedの初期化
長いので続きはGoogleドライブにあります→ https://drive.google.com/file/d/1bTnbssantyf9dEV5DOugZuloiVUh7H3D/view?usp=share_link >>955
名前とはうらはらにC#とCはぜんぜん違う
ここで聞くべきではない パクられるほどのアプリなんだろうか。
今日日、割られるとしたらパッチが広まるのも一瞬なんだから、それよりもちゃんと利用規約書いた方が良いんじゃないの?
はるかに金払うと思うよ。特に企業内ユーザは。 >>958
流行ってきてもすぐにコピーアプリつくられたら
収益激減しちゃうでしょ
利用規約なんて書いても少し変えてコピーアプリつくられたらおしまいだよ
実害がはっきりでる
例えば300円のアプリ、コピーされて100円で売られたらこっちは大損だよ 困るほど割られるならサーバー用意して認証するかな、俺なら
まあそんなアプリを公開できるとも思わんから取らぬたぬきなんだけどw >>960
native codeじゃないとかんたんに
サーバーの認証のコードが漏れちゃうでしょ
セキュリティ大事
でもNET7でようやくC#でnative codeをMSが許可したのは大きいね クライアントにAPIキーをハードコードしてるのか?ユーザー認証を実装しろよ
そんな初歩的な設計ミスしといてセキュリティもクソも >>961
もしかして認証ってクライアントからサーバーにログインするような奴しか知らんのか? >>959
実際Windows以外ではアプリ作っててそこそこダウンロードされてるけど、コピーアプリが追いついたこと無いぞ。
単純に品質と知名度でしょ。 .NET 7のNative AOTは今のところコンソールアプリとクラスライブラリで使えるらしい
今後範囲を広げていく計画だったと思うが
現状でWindowsアプリでも重要な部分だけクラスライブラリにすれば上で求められてることはできそうだな >>966
それはちょっと誤解がある
NativeAOTはコンソールアプリとして発行されるアプリケーション、もしくは(.NETのクラスライブラリではなく)ネイティブの共有ライブラリを作るときだけ使える
つまり、仮にWindowsアプリで部分的に使うならPInvokeが必要
なお、NativeAOTはASP.NET Coreアプリを動かすことをゴールとしており、GUIアプリのサポートは全く計画にない ネイティブのDLL作れるのはええな
わざわざその為だけにC++使う必要なくなるかな ソースが見られるのを恐れてるのはパクられるのを恐れてるんじゃなくパクったのがバレるのを恐れてるんだよな
お前なんかの作った物をパクるやつなんかいねーよと言いたくなるやつしか難読化難読化言わない あと.NETのリバースエンジニアリングがしやすいのは静的ライブラリじゃなくDLLを使ってるのと仮想メソッドを多用しているのも大きい
DLLで提供されるクラスを使う時や仮想メソッドを使う時は名前でアクセスせざるを得ないからどのクラスのどのメソッドを使っているかを隠すことができない
これはC++を使っても同じこと
本気で難読化したいなら標準ライブラリを使うのをやめた上でソースコードジェネレータを使ってソースレベルでクラス名や関数名をランダマイズするところから >>967
ASP.NET Coreは.NET8でnative AOT対応してくるかもしれない。
Azure運営してるMSとしては欲しい機能だろうし。
GUI appsもゴールにないという事はないと思うよ
やっぱり速度とかメモリ使用とかでnative有利だし。
MAUIで作ったiOSかMacアプリはnative codeでbuildされるとか見た記憶ある。
他社がnativeで動くならGUI appも対応しないとc#開発者がC#使うのをやめてしまう。 ここみると.NET7の制限というニュアンスで書いてある。
最終的にはふつうのWPFとかもnative AOT目指してるように思える。
https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/ >>969
コード見られるのを気にしない人はセキュリティに関して知識と意識が低いだけだと思う。
必要のない情報は極力見せないっていうのがセキュリティの基本だ。 >>974
何のセキュリティを気にしてんだよw
セキュリティの意味わかってないんじゃね? >>974
その理論だとつまりオープンソースはセキュリティが低すぎて使い物にならないってことだな
極力見せない以前に、見せていいものと悪いものの判断ぐらいできるようになれよ >>971
それよりVS 2017 からバージョンさせてほしい まあ認証まわりとか、ライブラリを使ってるのか自作なのかすら見せたくないのはわかる
個人のアプリじゃないと重箱の隅をつつかれることにもなるしね カジュアルな解読対策なら既存の難読化で十分だし、ガチのクラッカー相手ならマシン語になった程度じゃ無駄だよ そもそもターゲットになるようなアプリを公開できる奴がこんなスレにいるのかと... native AOTはスピードアップの恩恵も大きい。
C++くらい速いコードになるし欲しいに決まってる ならんと思うよ
C++は最適化のやり方がえげつないし安全より速度に倒してるから 最適化に関しては言語単位ではなくコンパイラ次第だけどな C言語でボードゲームを作成する課題についてです。重力付き4目並べを最終的にコンピュータと対戦可能にするように、テンプレートのコードに穴埋めしていく課題です。
@横7x縦6の盤面を立てて使用A2人で対戦、以下の0~6のマスを交互に選択B縦横斜めいずれか4コマ並べれば勝ち。以下はテンプレートのコードです(長いので続きはGoogleドライブにも置いてます)、これらの空白部分の穴埋めが分かる方、どうか教えてくださいお願いします。元テンプレコード↓→ https://drive.google.com/file/d/1bTnbssantyf9dEV5DOugZuloiVUh7H3D/view?usp=share_link
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define YMAX 6 // 縦方向のマス目の数
#define XMAX 7 // 横方向のマス目の数
int board[XMAX][YMAX]; // 0:未着手 1:先手のコマ● 2:後手のコマ○
int num[XMAX]; // 各列に置かれているコマの数
int choice = 1; // 0:未選択
// 1:人間(先手●)対人間(後手〇)
// 2:人間(先手●)対コンピュータ(後手〇)
// 3:コンピュータ(先手●)対人間(後手〇)
int turn = 0; // 先手か後手かを判定するための着手数
void InitBoard(void);
void DispBoard(void);
int CheckFull(void);
int SetXpos(int);
int CheckBoard(int, int, int);
int ComputeXpos(int);
int SearchConnect(int, int);
int main(void)
{
int xpos; // 入力したコマの置き場所,またはコンピュータが探したコマの置き場所
int player; // 1:先手の手番 2:後手の手番
int win = 0; // 0:プレイ中 1:先手の勝ち 2:後手の勝ち 3:引き分け
int ans;
while (1)
{
srand((unsigned int)time(NULL)); // 乱数を使う場合のseedの初期化
長いので続きはGoogleドライブにあります→ https://drive.google.com/file/d/1bTnbssantyf9dEV5DOugZuloiVUh7H3D/view?usp=share_link >>979
マシン語のリバースエンジニアリングできるやつなんて
プログラマーの1%もいないだろうし時間もかかるからほぼ回避できる。
解析する行為が割に合わなくなる
C#難読化だけとは安心度が全然違う >>985
マシン語に夢見すぎだしCのソースコードにデコンパイルできるぞ まあガチで最適化されてたらまともなCコードにはならんけどね 文法はCだけど中身はマシン語と変わらないなら地獄だけどそういうものになるんだろ?
ifとgotoとreturnとラベルだらけ Cとアセンブラの最も大きな違いはレジスタへのアクセスなんだよね。 >>995
レジスターやスタックを気にしながらプログラムを組むのは地獄だわな C++も終わりになるんじゃないの?
LinuxがRustで書くようになるとかいう噂?ニュースを見たよ
RustってOSも書けるんだな
Rustで安全で高速なコード書けたらC/C++ほぼ要らなくなるんじゃ? >>999
LinuxのカーネルがRustで書かれるかもっていう噂、ニュースね このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 366日 15時間 39分 58秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。