C#, C♯, C#相談室 P ..
[2ch|▼Menu]
197:デフォルトの名無しさん
07/09/02 01:10:38
.NETで書かれた商用アプリってありますか?

どうも、.NETでかかれたものを金出してまで使おうとは思えん

198:デフォルトの名無しさん
07/09/02 01:18:38
あるよ

199:189
07/09/02 01:31:54
ありがとう。 やりたいことは
Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory(
@"C:\test\", @"e:\", UIOption.AllDialogs

でいけそうだ。

でも、このメソッド、ダイアログを表示して、かつ自動的に上書きという
引数はないんですね・・・

上書きだけか、ダイアログを表示するだけか、しかない

出来れは自動的に上書きして、進行状況がわかればうれしいんですが…


200:デフォルトの名無しさん
07/09/02 01:39:16
>>197
コピペ?



201:デフォルトの名無しさん
07/09/02 01:47:38
>197
そう思う理由を教えてくれ

202:デフォルトの名無しさん
07/09/02 02:20:21
1.1のFormsで書かれた商品なら動かしたことがあるが、
リストに毎回描画するから糞重たくてむかついたことはある。
結局、最終的にアプリの出来はスキルで待ったく別物が出来上がるんだと
つくづく感じた。

203:デフォルトの名無しさん
07/09/02 02:22:49
PCがしょぼいんだろ

204:デフォルトの名無しさん
07/09/02 08:31:16
ユーザー固有のスタートメニューのフォルダは
Environment.GetFolderPath(Environment.SpecialFolder.StartMenu))
で取得できますが、
全ユーザー共通のスタートメニューのフォルダを
取得するメソッドは用意されていないのでしょうか?

ユーザー固有のスタートメニューのパスに含まれるユーザー名を
All Usersに置き換えればいいような気もしますが、
あらゆる環境で動くかどうか心配なので、
できれば、あらかじめ用意されている方法を使いたいと思っています。

205:デフォルトの名無しさん
07/09/02 11:07:38
SpecialFolder列挙体には含まれてないやつがあるし
実行時にenumの範囲チェックしやがるので
SHGetFolderPathを直に使うしかないと思う

206:デフォルトの名無しさん
07/09/02 16:25:56
インストーラ自作?

207:デフォルトの名無しさん
07/09/02 17:40:56
.NETで書かれたSDJEditorを使ってみたが、.NETの先が見えた気がした

EmEditorに比べるとほんと鼻くそ

やっぱ.NETで有名なネイティブアプリに勝つなんて無理でしょうか?

208:デフォルトの名無しさん
07/09/02 17:42:10
工作員必死だな

209:デフォルトの名無しさん
07/09/02 18:44:52
比較対象がEmEditorなんだ。
秀丸と比べるとほんと鼻くそだよね>Em

210:デフォルトの名無しさん
07/09/02 18:50:27
逆だな

211:デフォルトの名無しさん
07/09/02 20:07:14
サクラが一番

212:デフォルトの名無しさん
07/09/02 20:17:19
エディタなんてVisual Studioでいいじゃん

213:デフォルトの名無しさん
07/09/02 20:32:23
コーディングはVSでやってるけど
.txtなんかはEmEditorに関連付けてる

214:デフォルトの名無しさん
07/09/02 20:57:01
WebBrowserコントロールでMouseUpイベントを取ることは出来ないんですかね。
MouseDownは取れます。以下はVBですが。
URLリンク(homepage1.nifty.com)

Spy++で見てもLBUTTONUPとか表示されないので、そもそもムリなんですかねぇ。

215:デフォルトの名無しさん
07/09/02 21:42:12
>>207
アプリ&開発者が違うのに、開発ツールを比較するか?w

216:デフォルトの名無しさん
07/09/02 23:39:06
>>197
.net framework + 在庫管理や工程管理でぐぐったら出てくるよ。


217:デフォルトの名無しさん
07/09/02 23:46:12
>>197
これとか。
URLリンク(www.microsoft.com)

218:デフォルトの名無しさん
07/09/03 00:03:57
でも、おそいねw

正規表現をつかったらperlに負けた

スクリプトに負けますか・・・


219:デフォルトの名無しさん
07/09/03 00:05:51
Cの基本的な文法については勉強して次は実際にSourceForgeでオープンソースの
プログラムを読もうと思っていたのですが難しすぎて分かりません
みなさんはある程度文法の勉強をしてからどのようにして勉強していきましたか?

220:デフォルトの名無しさん
07/09/03 00:06:26
ここはC#スレです

221:デフォルトの名無しさん
07/09/03 00:15:02
>>218
正規表現エンジンの質やI/Oが主要なボトルネックになる類のプログラムでは
言語の差など微々たるもんだ
書き方にも拠るが、C++で書こうが普通にスクリプトのが速かったりする

222:デフォルトの名無しさん
07/09/03 00:33:11
>>218
毎回正規表現をコンパイルするコードなんて書いてないだろうな?

223:デフォルトの名無しさん
07/09/03 00:37:25
>>218
正規表現の処理がスクリプトで書かれてんじゃないだろw

224:デフォルトの名無しさん
07/09/03 00:39:59
.NETの正規表現エンジンは遅くて困るというほどでは無いにしろ、
そんなに速くないだろ
スクリプトの場合は、それがCで書かれているだろうしな

225:デフォルトの名無しさん
07/09/03 00:45:34
Regex のコンストラクタでオプションに RegexOptions.Compiled つけてる?

226:デフォルトの名無しさん
07/09/03 00:46:51
>>219
文法しかわからない奴が、SourceForge等で公開されているソースを読めるわけないだろ



227:デフォルトの名無しさん
07/09/03 00:48:28
俺も実験したことがあるが、正規表現をコンパイルしとくのは当然の話として、
C#で正規表現の性能を競ったらPerlやらPythonやらに普通に勝てんよ

そういう競争なら、相手はスクリプトではなくて、実質的にはCでカリカリに
チューンされたモジュールになる
勝てるわけが無いだろ

228:デフォルトの名無しさん
07/09/03 00:57:08
>>227
だったら、C#の存在意義ってなに?


229:デフォルトの名無しさん
07/09/03 01:01:45
>>228
さあ
無いと思えば無いんじゃね

性能はネイティブにゃ勝てんし
スクリプトみたいに手軽じゃないし
Javaみたいにwrite once, run anyware標榜してるわけでもねぇし

230:デフォルトの名無しさん
07/09/03 01:06:02
正規表現ならTcl最強説

231:デフォルトの名無しさん
07/09/03 01:16:10
>>228
一応言っとくが、自分で計算処理する分にはC#のがスクリプトよりは
格段に速いぞ
ネイティブのがさらに速いがw

自分の計算が主要なボトルネックになるタイプのプログラムかどうかが
一つのポイントだな
そうでないようなケースは案外多い

232:デフォルトの名無しさん
07/09/03 01:24:44
エミュレートされた仮想CPU上で動いてる訳でもなし、C#ではそもそも
記述できない低水準の処理以外の部分でネイティブコードと速度に差なんて出ようがないと思うが。

233:デフォルトの名無しさん
07/09/03 01:25:22
普通速度なんか気にする必要ないだろ
体感できるほど遅くなるアプリなら最初からネイティブしか選択肢ないし
そんなんめったに書くことない

234:デフォルトの名無しさん
07/09/03 01:25:22
そもそもさぁ

早いとか、遅いとかって言ってる奴は、証拠のソースを出せよ

だってさ
PerlもPythonも、コンパイル時に正規表現のコンパイルと最適化をしている
C#やJavaは実行時
どうやってコンパイルと最適化に消費する処理時間を考慮するの?

235:デフォルトの名無しさん
07/09/03 01:27:24
>>233
速いことより、遅い方がいいことってあるのかしらん?


236:デフォルトの名無しさん
07/09/03 01:27:52
実行時にネイティブにコンパイルされるといったって
C#は安全性を気にして余計な処理をしてるだろ
Cとかと比べたらどうしたって遅くなる

237:デフォルトの名無しさん
07/09/03 01:28:44
>>235
速度の違いが体感出来ないならC#使ってもデメリットはない
プログラミングが楽になるからC#使った方がいいというわけだな

238:デフォルトの名無しさん
07/09/03 01:29:28
>>232
そりゃJITだけどCにゃ負けるようだよ
URLリンク(shootout.alioth.debian.org)
これはMonoだが、Java Server VMの性能が参考になるだろう

239:デフォルトの名無しさん
07/09/03 01:32:20
そもそも.NETで不満になるようなアプリってどれぐらいあるんだ?
大体.NETは実行スピードと生産性のバランスの中のひとつの解に過ぎないだろ

240:デフォルトの名無しさん
07/09/03 01:34:25
.NETは計算速度はそんなに遅くねぇけど
起動がのろいのとGUIもっさりはどうしようもねぇな

241:デフォルトの名無しさん
07/09/03 01:36:40
ソース出ないね
やっぱり法螺吹きか

242:デフォルトの名無しさん
07/09/03 01:37:14
>>234
CLIランタイムをロードする時間に比べりゃ、正規表現のコンパイルにかかる時間など
微々たるもんだろw

243:デフォルトの名無しさん
07/09/03 01:38:13
Win32のBitbltとか呼んでももっさりするかね?GDI+よりは早い。

244:243
07/09/03 01:38:59
すまん。最後は疑問系です・・・(ノД`)

245:デフォルトの名無しさん
07/09/03 01:41:19
>>243
DDBのblitはGDI+の10倍は速いらしいな
その時点でWinFormsだめぽ

246:デフォルトの名無しさん
07/09/03 01:45:05
>>241
そんなに気になるんなら自分でためせばいいのに

以前俺が実験したソースをあげるよ
URLリンク(www.borujoa.org)

青空文庫のテキストを適当に置換するプログラム
inputというフォルダにサンプルの入力ファイルがあるが、300K程度の
サイズだから、気になるならデカくしてみるんだね

247:デフォルトの名無しさん
07/09/03 01:53:14
>>239
それはあくまで作る側の屁理屈

使う側からすれば、生産性なんてどうでもいい

あなたが、よく使うアプリケーションが次バージョンから.NETで書かれたらどう思う?
LightWaveが.NETなんかで書かれたら俺は間違いなくMAXへ移行する

248:デフォルトの名無しさん
07/09/03 01:57:26
>>247
えーとね、生産性悪くなるとコストがかかるんだよ。
それは製品価格に反映されたり、次バージョンで実装される機能が少なくなったりすることになるんだよ。

249:デフォルトの名無しさん
07/09/03 02:05:21
>>247
なんでアセンブラでつくらねーんだっていってみろ。


250:デフォルトの名無しさん
07/09/03 02:06:39
まあ、問題は、場合によっては普通にLL言語にさえ後れを取る
C#がバランス上最適解かどうかだろうなw

251:デフォルトの名無しさん
07/09/03 02:06:52
製品の値段に直結するぞ。
機能も少なくなるぞ。
品質が下がることもあるぞ。


252:デフォルトの名無しさん
07/09/03 02:07:02
けど、C#が使えないのは事実
C#しかつかないやつはVC++で開発してる部署に行ったらほぼ終わり

253:デフォルトの名無しさん
07/09/03 02:07:34
>場合によっては普通にLL言語にさえ後れを取る
絶対にLL言語に遅れをとらない言語ってなんだよw


254:デフォルトの名無しさん
07/09/03 02:09:30
VC++しかつかないやつは他の言語で開発してる部署に行ったらほぼ終わり


255:デフォルトの名無しさん
07/09/03 02:14:15
>>246
・300kのIO速度の計算をスルー
・300kのSJISから内部コードの変換(UTF-16やutf8)コストもスルー
・(C#)2000行の無駄なnew StringBuilderとToString、+演算子置き換えで高速化

正規表現のベンチになってないよ

256:デフォルトの名無しさん
07/09/03 02:17:16
>>255
うん、正確な正規表現のベンチのつもりで書いたのではないよ
それが求めるものなら自分でやってくれ

IO処理は「どの言語でも」やっている
ユニコードへの変換も「どの言語でも」やっている
オーバーヘッドの大きそうなフォーマット処理も、PerlやPythonでもやっている

概ね、カリカリに書かずに適当に同じレベルで「普通に」書きなぐったものだ
特に何かをひいきしたつもりは無い

そうやって書いたものが、スクリプトが案外速かった(C#より速い)ってのが
重要ね。

257:256
07/09/03 02:28:23
ちなみにC++も三種類書いてみたが大して速くなかったね。
ソースを見れば分かるが、LL言語で書くよりずっと複雑でトリッキーで
エラーを産みがちなコードになるというのに。

こんな仕事はLL言語向きだ。他の解は馬鹿げている。そう思ったよ。
そして、そういう仕事は案外多いのだと思う。

258:デフォルトの名無しさん
07/09/03 02:37:29
プロセスの生成負荷も考慮されてない…
C#、C++、Perl、Pythonではエンジンの起動時間は大きく違うし、
いくらなんでも、これで決めつけるのは早計だと思うが。

俺のPCでは、C#の方がPerlより速かったり遅かったりだった。
一瞬すぎて測れない。
Core 2 Duo E6600, 2GB, Win Vista
Super Fetchがどこまで効いているかはわからない。

明日kwsk調べようかな。

259:デフォルトの名無しさん
07/09/03 02:45:50
正規表現の処理の話をしてるときにこれはない


260:デフォルトの名無しさん
07/09/03 02:46:28
つうか試してないけどコンパイルしないほうが早かったりしてよw


261:256
07/09/03 02:54:56
>>258
入力ファイルデカくしてみそ
二回目以降はキャッシュが効くし、入力が十分デカければ起動時間は誤差の範疇に
持ち込めると思うが
ちなみに俺の環境はXP、Pentium M(1.7GHz), RAM 500Mだからずっとショボい

>>259
純粋に正規表現エンジンの性能を計りたいんなら、そうだね
俺がやったのは、正規表現を用いた典型的なPerlの使い捨てスクリプトレベルの
仕事を各種の言語で書いてみた、それだけのことで、やっている仕事自体は
どの言語でも同じだよ

262:デフォルトの名無しさん
07/09/03 03:15:34
せめてマッチ対象文字列は、メモリに確保しておかないとベンチにならんだろw

263:デフォルトの名無しさん
07/09/03 05:29:41
起動が早い言語の勝負じゃないからな

264:デフォルトの名無しさん
07/09/03 09:15:08
>161
ご回答ありがとうございます。

そんなことを頻繁にするかどうかは知らんよ。
俺がちゃんとわかってる人かどうかは
あんたが決めることじゃねえよ。スキルチェックでもしてくれ。

265:デフォルトの名無しさん
07/09/03 10:34:36
プログラマーなんだから、C++とC#両方使えるようになろうや。

266:デフォルトの名無しさん
07/09/03 11:35:59
C++なんぞ使ってると脳みそが腐るぜ

267:デフォルトの名無しさん
07/09/03 11:39:14
C++使ってる奴がまだ居たなんて・・・

268:デフォルトの名無しさん
07/09/03 12:30:18
C++は使えませんが、C++でできています。

269:デフォルトの名無しさん
07/09/03 12:58:35
C++はC++でできています

270:デフォルトの名無しさん
07/09/03 13:29:49
gccがgccでコンパイルできるようになりました、というのは結構画期的なことだったらしいが

271:デフォルトの名無しさん
07/09/03 14:01:15
foreachループ変数が書き込み禁止だってことを今更ながら知ったのだが・・・
なんでこんな制限があるんだ?
コレクションに変更を加えるわけじゃないし問題ないと思うんだけど。

272:デフォルトの名無しさん
07/09/03 15:49:14
C#で変数名に変数を使うやり方ってどうやるんですっけ?
test_i(i=1,2,3・・・)みたいな。

273:デフォルトの名無しさん
07/09/03 15:54:20
配列を使いましょう

274:デフォルトの名無しさん
07/09/03 16:06:14
>>271
たとえば
string[] strArray = new str[]{"a","b","c"]
foreach(string str in strArray)
{
s="d"
}

ってやってもstrArrayには反映されない。

foreachの列挙子はIEnumerableの実装いかんによっては、何を
参照しているのか全く保障されない。
IEnumeratorは上記の例のようにコピーを返してくるかも知れない。
あと、IEnumuratorの実装クラスは「列挙」できればよく、要素の概念
を持たないものだってあるからね。
MSDNのIEnumerableのサンプルをみてみそ。

275:デフォルトの名無しさん
07/09/03 16:30:21
>>271
「変数の使いまわし」ができないようにするのが最近の流行だから。
バグが減ると信じられてる。

276:デフォルトの名無しさん
07/09/03 16:36:34
foreachって実際は

while(strEnumerator.MoveNext())
{
 string str = strEnumerator.Current;
 ...
}
こんな感じでしょ
代入しても無意味というか、元が配列だったりすると
書き換えられるという錯覚を与えかねない
というか配列のforeachは
for(int i = 0; i < strArray.Length; ++i)...
に置き換える最適化がされるらしいから
実際に書き換えられちゃうんでそうするとforeachの意味が変わっちゃう

277:271
07/09/03 16:55:47
>>274
>>276
foreach変数ってIEnumeratorの実装に関わらずスタック上に置かれるものでは。
構文上もそこで宣言してるわけだし、直接書き換えられると誤解される余地もないと思うけど。

>>275
それで余分な変数を導入する方が場合によっては可読性が落ちると思うんだけどなあ。
というかforeach変数だけ禁止しても意味がないような・・・

278:デフォルトの名無しさん
07/09/03 17:01:33
>>277
たしか、usingとかfixedとかで宣言した変数も使いまわしできないな。

279:デフォルトの名無しさん
07/09/03 17:55:02
むしろforが例外か

280:デフォルトの名無しさん
07/09/03 19:45:58
>>271は単に参照型と値型の区別がついてないというか、データがメモリにどう
配置されるかのイメージがつかめてないだけの気がする。
>>275は意味不明だと思う。

繰り返し変数はもとの変数のビットイメージのコピーであってもとの変数そのものではない。
これが理解できていれば271はそもそも愚問であって、こんな疑問は抱きようがないんじゃないか?

281:デフォルトの名無しさん
07/09/03 19:55:24
その後の流れをちゃんと読めよw
271はforeachでコレクションの内容を変更したいんじゃなくて、例えば
//引数に与えられた値+2を返すメソッド
int Plus2(int value){
value += 2;
return value;
}
みたいなことをforeachの繰り返し変数でもやりたいんだろ

282:デフォルトの名無しさん
07/09/03 20:13:55
int Plus2(int value){
return value + 2;
}
でいいじゃん

283:デフォルトの名無しさん
07/09/03 20:20:09
なんという正論

284:デフォルトの名無しさん
07/09/03 20:20:50
>>282 頭悪そうだな・・・

285:デフォルトの名無しさん
07/09/03 20:22:57
まあ281の例えも悪いよ。
変に例える必然性なんて全然ないのにね。

286:デフォルトの名無しさん
07/09/03 20:24:32
というか、+2と決めうちなのにメソッド作る意味があるか?

287:デフォルトの名無しさん
07/09/03 20:26:09
281の方が頭悪そうだ

288:デフォルトの名無しさん
07/09/03 20:26:40
>>271
あるいは逆にコレクションに変更を加えようとしてミスるプログラマが出るのを予防するためだな。

D言語ではforeachの制御変数には明示的にrefキーワードをつけないと、代入できないようになってる。

289:デフォルトの名無しさん
07/09/03 20:30:55
それどんな感じで列挙子を実装するの?

290:デフォルトの名無しさん
07/09/03 20:33:54
>>288
そんなアホグラマは正直無視でいい・・・
と思うのは俺だけ?

だってそんなこといったら仮引数だって変更不可にするべきじゃん

291:デフォルトの名無しさん
07/09/03 20:42:45
>>289
int opApply(int delegate(ref T));というメンバ関数を実装する。
URLリンク(www.kmonos.net)

>>290
Dでは仮引数にinキーワード(あるいは、finalキーワード)を追加することによって、仮引数への代入が制限されますよ。

要するに、最近は酔っ払いでも使えるような言語設計が流行っているのだ。

292:デフォルトの名無しさん
07/09/03 20:50:44
フェイルセーフがあるのは結構な事じゃないか

293:デフォルトの名無しさん
07/09/03 21:01:28
いつも酔っぱらってこーでぃんぐしてるからありがたい

294:デフォルトの名無しさん
07/09/03 21:45:38
参照型の場合
foreach (Hoge h in Hoges) {
  h = new Hoge(); // はダメでも
  h.Member = 123; // は全然OKだから
あまりガードにはなってないよね。

295:デフォルトの名無しさん
07/09/03 21:55:27
…なんか勘違いしてないか?

296:デフォルトの名無しさん
07/09/03 22:11:00
>>295
なんかって何?一言主さん

297:デフォルトの名無しさん
07/09/03 22:13:01
フェイルセーフがいいならC++のconstなんか真っ先に導入しなきゃダメだろ
キャッチしなきゃいけない例外も必要だろ
C#はそういうのが意図的に外されてるんだな
意味ないから

298:デフォルトの名無しさん
07/09/03 22:15:50
VC++(2005)のMS拡張構文ではconstのあるなしで調整できるようだ。
// cl /EHsc
#include <vector>
#include <iostream>
int main() {
  std::vector<int> v;
  v.push_back(1); v.push_back(3); v.push_back(5);
  for each(int r in v) {
    r++; // OK
    std::cout << r << std::endl;    
  }
  for each(const int r in v) {
    r++; // Error
    std::cout << r << std::endl;    
  }
}

299:デフォルトの名無しさん
07/09/03 22:18:01
>>297
いや、チェック済み例外は明らかに設計ミス。

300:デフォルトの名無しさん
07/09/03 22:21:40
しかしネットワークなんかだと、
絶対に間違いが起きる可能性がある処理はあるわけじゃない
そういうのをどうやって実装すればいいの

301:デフォルトの名無しさん
07/09/03 22:27:25
そんなのインテリセンスなりナンチャラペットの水準でサポートすれば
済むことじゃないの?

まあ、それ以前にドキュメントをちゃんとして欲しいよねw

302:デフォルトの名無しさん
07/09/03 23:09:05
constもチェック済み例外も問題の根は同じ。不必要に実装に結び付く(透けて
見せる)シグニチャである点。


303:デフォルトの名無しさん
07/09/03 23:15:15
>>277

あんた、単なる素朴な疑問かと思ってたけど
真正のあほだな

304:デフォルトの名無しさん
07/09/03 23:16:10
VC# ExpressEditionダウンロードしたんだけど
オフラインでMSDN見ることってできないんですか?

305:デフォルトの名無しさん
07/09/03 23:21:54
ふらっとに行くべき

306:デフォルトの名無しさん
07/09/03 23:31:16
>>302
意味がよくわからないから詳しく説明してくれ

307:デフォルトの名無しさん
07/09/04 01:41:01
>>290に同意。費用対効果の低いフェースセーフ要らないぽ
constだので縛ってもバグは斜め上からやってくるね。
sealedつけてたのにsealed外されるとか。

foreachといえば、配列に関してはfor文と同等の速度が出ますが、こういう情報はどこにあるのでしょうか?
パフォーマンスガイドラインに重いループではforeachよりforって書いてあったので
わざわざ変えたのに・・悲しい。

308:デフォルトの名無しさん
07/09/04 02:21:04
英語だけどパフォーマンスの話題はここが詳しいかな
URLリンク(msdn2.microsoft.com)
1.1に基づいてるからまだforが速いって書かれてはいるが・・・

URLリンク(msdn2.microsoft.com)
ここにもパフォーマンスの記事が結構たくさんあるね
特にKnow What Things Costは命令ごとのコスト表が載ってて面白いかも

309:デフォルトの名無しさん
07/09/04 02:52:52
>>307
2.0だとforeachのほうが若干早くなってますね。
foreach (int v in ar) csum += v;
for (int i=0; i < 10000; i++) csum += ar[i];

これを下のように書くとforeachと同じスピードになるからそういう最適化をしてるのでしょう。
fixed (int *sp = &ar[0]) {
 int *ep = sp + 10000;
 for (int *p = sp; p < ep; p++) csum += *p + j;
}

ただ、foreachの制御変数が読み取り専用なのは、フェイルセーフのためなのか、
最適化のためなのかは判断がつきません。

310:デフォルトの名無しさん
07/09/04 07:54:38
アンセーーーーーフ!!
なるほど、「処理を直接記述されると最適化できないが
抽象度を高くすると最適化しやすい」というやつか
forよりforeachの方が早い
LINQも早くなるという

しかしループ変数への代入を許すとこの最適化が出来なくなるわけか

311:デフォルトの名無しさん
07/09/04 09:28:17
アンマネージドのコードと同期をとりたく、
EventWaitHandle.Handle プロパティで
ネイティブのハンドルを取得しようと思ったのですが、
「古い形式です」と起こられてしまいます(警告)。
新しい形式ではどのように書くのでしょうか?




312:デフォルトの名無しさん
07/09/04 09:37:04
>>311
MSDNにずばり書いてあるから、まず自分で調べるくせをつけろ。

313:デフォルトの名無しさん
07/09/04 09:37:06
あ、
EventWaitHandle.SafeWaitHandle.DangerousGetHandle()
でいいみたい。
Safeなんだか、Dangerousなんだか。


314:デフォルトの名無しさん
07/09/04 10:15:09
>>313
DangerousGetHandle()は必要?
MSDNでは、
>このクラスを使用すると、派生クラスのインスタンスでラップされたアンマネージ リソースを
>識別するハンドル (オペレーティング システム ハンドルなど) をアンマネージ コードに
>渡すことができます。
となってるし、使用例にあるWindowsAPIの呼び出しサンプル見ても、IntPtrの代わりに使ってる。
というか従来のIntPtrの代わりに使うべきもののように見える。
DangerousGetHandle()はデバッグのためにハンドル値を16進でダンプしたいとかの特殊用途のために
残してあるんじゃないか。

315:デフォルトの名無しさん
07/09/04 11:08:29
>>314
なるほど。ほんとだ。

ハンドルは、PVOIDだろ、と、
[DllImport("native.dll")]
public static extern void NativeFunc(System.IntPtr hHandle);
して、Handleプロパティから渡していたので、、
替わりにSafeWaitHandle使えと言われても、型が違ってこまってました。

[DllImport("native.dll")]
public static extern void NativeFunc(SafeWaitHandle hHandle);
こうすればいいんですね。


316:デフォルトの名無しさん
07/09/04 12:42:53
デンジャラスなんてついてるメソッド使いたくないお

317:デフォルトの名無しさん
07/09/04 13:35:00
IntPtrで問題が発生したら泣き寝入りするお

318:デフォルトの名無しさん
07/09/04 18:41:40
>>316-317
正直、「ボキュはキモヲタだお」って言ってるようにしか聞こえない。
そういうの気色悪いと思わない自分を気色わるいと感じるべきだ。

319:デフォルトの名無しさん
07/09/04 18:48:43
どうか、次のVBをC#に直して下さい。

Label1.Text = Replace(Session("body"), vbCrLf, "<br />")

-----------------------------------------------
VBの本の中にソースが載っていたのですが、
この1文が、どうにもわかりません。

そのコード意味は、どうやらセッションというデーター内の改行を
HTMLの改行に変換するっぽいのですが・・・。(推測)

ちなみに、他の行は自力で調べましたが肝心のこのコードが分りませんし、
C#でどう書けば良いのか分りません。

賢者の方々、どうか愚者の私にご指導をお願い申し上げます

320:デフォルトの名無しさん
07/09/04 18:54:20
>>319
少しはググるとか努力しろよ

VB.NET固有の関数をC#で使用するには?
URLリンク(www.atmarkit.co.jp)

でも、それただの部分文字列の置換でしょ?
String.Replaceか正規表現で代用できるでしょ。

321:デフォルトの名無しさん
07/09/04 18:54:33
>>319
URLリンク(zoosir.hp.infoseek.co.jp)
C#だと省略可能引数(Optional)が無いから、全部書く必要があるらしい。

322:デフォルトの名無しさん
07/09/04 21:35:51
>304
MSDNも普通にフリーとして公開されてなかったか?

323:デフォルトの名無しさん
07/09/04 21:54:39
csc.exeやvbc.exeって開発環境がなくてもインストールされるものなんですか?
C:\windows\Microsoft.NET\framework\以下にあるのでそんな気がしますが。

324:デフォルトの名無しさん
07/09/04 21:57:13
はい。実行時に使用する場合もあるので、全ての環境に含まれています

325:デフォルトの名無しさん
07/09/04 22:03:35
>>324
おお、そうだったんですか。
これで安心してCodeDomが使えます。

326:デフォルトの名無しさん
07/09/04 22:17:14
標準添付はcsc/vbc/jscの三つ、だったかな確か clは非標準だよね
標準なのにドマイナーなのがひとつ

327:デフォルトの名無しさん
07/09/05 00:09:57
Control.Invoke系のメソッド呼ぶとどっかで内部的にファイナライザが必要になるっぽいな。
ループの中から呼んだりして大丈夫なんだろうか。
何千何万って呼んだらなんか嫌なことになりそうな気がする。

328:デフォルトの名無しさん
07/09/05 00:15:47
ここは散文を書くところではない。
説明調の、他人に意味がちゃんと通じる文章書けよ

329:デフォルトの名無しさん
07/09/05 00:23:22
え、ファイナライザのコストが高いことを説明しろってこと?
それは説明するまでもないと思ったけど。

何が通じてないのかわからん。
Invoke系のメソッドってのはInvoke、BeginInvokeのことだよ
それらを呼んだら内部的に生成されるオブジェクトでファイナライザが呼ばれるっぽいんで嫌だなって話。

330:デフォルトの名無しさん
07/09/05 00:37:10
何をみてそう思ったの?


331:デフォルトの名無しさん
07/09/05 00:38:28
>何が通じてないのかわからん。
読む側の立場に立って自分の文章推敲できない人間はたいていそうだ。

ついでに、ファイナライザのコスト?
意味がわからない。
デリゲートを処分するコストがそんなかかるのかね?

仮にかかるとして、コストとは「時間当たりのCPUの使用量」のことだと思うが、
どのみちmsのオーダーでInvokeとか不可能だから意味がないだろう。

332:デフォルトの名無しさん
07/09/05 00:39:31
>それは説明するまでもないと思ったけど。
いったいどんな頻度でControl.Invokeなんかを実行する気だ?


333:デフォルトの名無しさん
07/09/05 00:44:23
>>327
再描画を伴わないControl.Invokeの使い道って
あんまり思いつかないんだけどどうだろ?

経験上、何千何万って単位でControl.Invokeを呼ぶと
再描画コストが恐ろしいことになる。

WinFormsなら1秒間に10回ぐらいの更新でいいんじゃないかね?
まあそれ言い出すとTimerでいいじゃんて話も多いんだけど。

334:デフォルトの名無しさん
07/09/05 00:44:31
>>330
CLR Profilerで見れるよ。

>>331
URLリンク(msdn.microsoft.com)
この辺でも読んでくれ。
なんでデリゲートが出てくるのかわからんが・・・

>>332
別スレッドでなんかの処理中にUIを更新するために呼んだりしない?
まあ何万は言いすぎかも。

335:デフォルトの名無しさん
07/09/05 01:04:23
>>322
ヘルプから見れるキーワードとか目次がMSDNなんですか?

336:デフォルトの名無しさん
07/09/05 01:05:13
>>334
読んでくれって、どこにもお前さんが主張しているような類のことは書いてないだろw

337:デフォルトの名無しさん
07/09/05 01:10:27
>334 CLR Profilerで見れるよ。
Control.Invokeを使ったらファイナライザが実行されたってこと?EndInvokeしてても?


338:デフォルトの名無しさん
07/09/05 01:13:32
ファイナライザのコストが高い(高くなりうる)ということ自体はわかるが、
Control.Invokeで実行されるというファイナライザを持つオブジェクトが内包するオブジェクトとか。
Control.Invokeを実行する通常の頻度とかから考えて、それが問題になるほどコストが高いとは思えん
ということだよ。

「ファイナライザのコストが高い」という表現自体をそのまま疑ってるんじゃない。
ついでにEndInvokeしたらファイナライザは実行されないんじゃないの?普通に考えて。
と思っただけで、まあこれはプロファイラで確認してそうなってるってんならそうなのかもしれん。


339:デフォルトの名無しさん
07/09/05 01:17:46
>>335
VS2005 Expressのヘルプに標準で何が入っているかは知らないが、MSDNライブラリはこれ。
URLリンク(www.microsoft.com)

2.5Gバイトほどあるから注意してくれ。

340:デフォルトの名無しさん
07/09/05 01:22:22
ファイナライザはそれを行わなければならないものが一つでもあると
GCを二回行わなければならず単純計算でGCにかかる時間が倍になるんじゃなかったか

341:デフォルトの名無しさん
07/09/05 01:27:36
>>337
>>338
EndInvokeしても呼ばれるみたい。
やっぱgen0でちゃちゃっと回収されるから問題が少ないってことなのかな?
具体的にはControl.ThreadMethodEntryってオブジェクトだけど
ファイナライザの処理自体はシンプルだけど他のオブジェクトへの参照は割とごっそり保持してるみたいだな。

まあ他に代替手段があるわけじゃなしどうこういっても仕方ないんだけどね。

342:デフォルトの名無しさん
07/09/05 01:42:58
おお?なんだこの意味なしFinalizeはw
いらねーじゃねーかよ。


343:デフォルトの名無しさん
07/09/05 01:48:44
>他のオブジェクトへの参照は割とごっそり保持してるみたいだな。
そんなに困らないオブジェクトが多いけどな。
まあ引数とか戻り値はクリアしてほしいところだが


344:デフォルトの名無しさん
07/09/05 01:58:26
だいたい、GEN1までで回収できたら、負荷的にはまあそんなに大きくはならないようだな。
GUIアプリだし、特にControl.Invokeなんて同期実行なんだから、まあ普通はまずGEN1ですべて回収できるだろう。


345:デフォルトの名無しさん
07/09/05 02:05:06
SuppressFinalizeを書き忘れてるんじゃないか

346:319
07/09/05 11:20:12
>>321賢者
一応、下記ソースに変更出来ました。
的確な助言、ありがとうございました。

if ((string)(Session["Body"]) == null)
{
  Label1.Text = "<br />";
} else {
  Label1.Text = ((string)(Session["Body"])).Replace("\r\n", "<br />");
}


347:デフォルトの名無しさん
07/09/05 11:24:43
暇があったら as 演算子を調べとくといいよ

348:319
07/09/05 11:45:52
>>347 神へ

ご助言の通り、as演算子をしらべました。
お陰でたまに出るエラーがなくなりました。
さすがは神ですね。
即レスにも関わらず、100%的中でした。

なぜ、私がたまに出る意味が理解できないエラーで苦労している所を
お察し出来たのか愚民にはわかりませんが、
貴方の英知で、救われました。
再びお礼を申し上げます。

string s = (string)(Session["Body"]) as string;
if (s == null)
{
  Label1.Text = "<br />";
} else {
  Label1.Text = ((string)(Session["Body"])).Replace("\r\n", "<br />");
}


349:319
07/09/05 12:08:38
※すみません。下記に訂正しました。

string s = (string)(Session["Body"]) as string;
if (s == null)
{
  LabelBody.Text = "<br />";
} else {
  LabelBody.Text = s.Replace("\r\n", "<br />") + "<br />";
}


350:デフォルトの名無しさん
07/09/05 12:18:23
まだキャストしてんじゃん。

string s = Session["Body"] as string;

じゃないとエラーでるっしょ

351:319
07/09/05 12:22:14
>>350
いいえ。
今の所、何もエラーがでませんが?

でも、助言ありがとう。

352:デフォルトの名無しさん
07/09/05 12:39:14
>351
エラーは出ないけど
string m = ((string)"Hello")

とはやらないだろって事じゃない?

353:デフォルトの名無しさん
07/09/05 12:59:04
>>352
うん。私もそう思ったので、助言どおりに直しました。
だから、「助言ありがとう」とカキコしたよ。(^^

354:デフォルトの名無しさん
07/09/05 13:34:37
foreachを書き込みしたいっていう人は具体的に何をしたいの?
1. foreachのループの中でコレクションの書き換えをしたい。
2. foreachのループ変数を書き換えることによって、ループの制御をしたい

1.なら foreachのループ変数はコレクションの要素とは無関係な場合もある。
そもそも、IEnumerableには「要素」の概念はないし、arrayみたいにIListを実装した
インデックスを通じて要素にアクセスできるコレクションとは限らない。

2なら、ループのカウンタはIEnumerableの内部でループ変数とは別に
管理されているから、無駄(というか、おそらく何も起きない)。

だと思うんだけれど、ほかに何か書き込み許容するといいことってありますかね?

355:デフォルトの名無しさん
07/09/05 13:54:18
今更その話か
ちゃんと読めとしか言いようがないが、1でも2でもない(つーか2は意味がわからんが)

あえて例を出すならこんなことがしたいんでしょ
foreach (string str in input)
{
str = str.Trim().ToLower();
if (str.Length == 0) throw new exception("Invalid");
Console.WriteLine(str);
}

356:デフォルトの名無しさん
07/09/05 14:15:34
>>355

なるほど、そういうことか。全然議論が見えてなかった。
Console.WriteLine(str.Trim().ToLower());
でも書き込み禁止だとエラー出るのかな???

355さんの例みたいに条件分岐したいような場合は
たとえ書き込み禁止じゃなくても、可読性のために仮変数おいたほうが
いいとおもうけど…。

357:デフォルトの名無しさん
07/09/05 14:15:34
>>353
object o = 1;
string s = (string)o as string;

358:デフォルトの名無しさん
07/09/05 14:29:43
えーっとだな…

それはなんだ?


359:デフォルトの名無しさん
07/09/05 15:28:55
C#からC++のクラスライブラリを利用するには、
URLリンク(www.atmarkit.co.jp)
のように、publicメンバすべてをラップしか、方法ありませんか?


360:デフォルトの名無しさん
07/09/05 15:30:10
dt=$.split(' \n');dt[dt.length]='';for(i=0;undefined!=dt[i];i+=2){write(dt[i-i%2+1].replace('jp.','').replace('www.',''));br();write(dt[i-i%2]);br();}


361:デフォルトの名無しさん
07/09/05 15:36:46
>>359
使うメンバだけラップすれば良いよ。
COM 化するって手もある。

362:359
07/09/05 15:53:00
>>361
なるほどCOMって手も。。

説明まちがえた。
すべてのメンバか使うメンバだけって、ところが問題じゃなく、
いちどC++/CLIでラップしなければいけないのかどうか、知りたかった。

ラップするのはここではC++/CLIだが、
直接C#でラッパを書いて、マネージドのクラスライブラリを作ることは
可能ですか?


363:デフォルトの名無しさん
07/09/05 16:01:12
>>362
C++/CLI でラッパを書く、C++ で COM 化するのいずれも避けるには?ってことですか。

ヘッダファイルとオブジェクトファイル(あるいはソースコード)で供給されるような普通の
良くあるクラスライブラリの場合、そもそもライブラリ側のコードを呼び出す手段が無い
ですよね。

dllexport されているクラスなら MSVC の ABI に従って呼び出してあげれば動くでしょうけど、
そういうライブラリはあまりないし、割に合わないような気がする。


364:デフォルトの名無しさん
07/09/05 16:34:36
今ハードウェアとやりとりをしなければならないので、PInvoke を使って DLL にアクセスしています。
この DLL の Open 関数を構造体を引数として呼んであげると、この構造体の中にデータが入って
返ってくるというものです。
で問題はこの構造体のメンバに構造体の配列が入っており、この構造体の配列を取得することが
できません。( 構造体の他の int のメンバは取得できています。以下でいうところの ID )
このような構造体下の構造体を取得することはできないのでしょうか。

struct Parent
{
public int ID;
public Data[];
}

struct Data
{
public int RawData;
public int Length;
}


365:359
07/09/05 16:38:33
>>363
すみません、最後の、
dllexport されているクラスなら(snip)動くでしょうけど、
について、もすこし教えてください。dllexportすれば、
C#から直接呼べますか?


366:デフォルトの名無しさん
07/09/05 16:59:15
>>365
exportする側は
URLリンク(msdn2.microsoft.com)(VS.80).aspx
あたりを参照

メンバ関数がどういう名前でexportされるかはコンパイラ依存。
dll 生成時の出来る lib を見て自分で調べる。
仮想メンバ関数は vtbl 経由でアドレスを取得。

MSVC の 呼び出し規約は基本 __cdecl ですが this を ecx に入れて呼ばなきゃないので、
そこだけは C++ というかアセンブラの補助が必要ですね・・・

367:デフォルトの名無しさん
07/09/05 17:00:01
あなたがCでDLLExportされたC++クラスのコンストラクタを起動し、
vtblに格納されているか少なくとも名前マングリングされたthisコールの
メンバ関数を起動し、スローされた例外を上手いこと取り扱い、最後に
デストラクタを起動して破棄できるのなら、C#でもきっと出来るだろう。

368:デフォルトの名無しさん
07/09/05 18:36:48
大人しくEXEキックしてコンソールで取り込めば?

369:359
07/09/05 19:13:34
>>366 367 368
みなさん。ありがとうなんとなく理解した。

[DllImport("native.dll")] extern static void Hoge()で、
C#から、Cの関数は呼べる仕組みがあるし(マーシャリングもあるし)、
マネージドであるC++/CLIからは、C++/Native のオブジェクトをnewできるし、
なので、C#からC++/Nativeにアクセスできる方法も実はあるんじゃないかと、
ちょっと期待して質問してました。


370:デフォルトの名無しさん
07/09/05 21:11:06
>369
これはマジレス
キャストやアンマネージDLLを使うならVB.NETがいい。

VBFixedArrayにDECLAREで処理するDLLをC#で呼ぶ。
アンマネージVBが噛むと処理が激重だから、処理が軽いもの限定だけど。

FORTRAN
C
C++
で構造体処理するDLLも一発でいくよ

371:デフォルトの名無しさん
07/09/05 21:12:58
VB 使うくらいなら俺は C++/CLI を選ぶぜ

372:デフォルトの名無しさん
07/09/05 21:29:01
エクセルとか操るならVBの方がずっと楽だと思うけど、
アンマネージdllの関数呼ぶ手間はあんまり変わらないんじゃない?

373:デフォルトの名無しさん
07/09/05 21:32:03
>371
C++/CLIでやるのもありだな。2003ですまない

374:デフォルトの名無しさん
07/09/05 21:34:15
>372
それはVB.NETじゃなくないか?

375:359
07/09/05 21:38:27
>>370
ラッパをVBで書く?
>>371
私もなんとなく同意。

やりたいことは、ネイティブなC++クラスライブラリを、
マネージド(C#)から使えるクラスライブラリにしたい。です。

結局C++/CLIでくるむ方法を取ることになりそうで検討中ですが、、
publicなクラス → ラッパクラス
interface → ??
publicなメンバ関数 → 全部ラッパ
publicなメンバ変数 → プロパティ
#define定数 → static const な定数
struct → ??
enum → ??

どのように書き換えたらいいか、わからないとこ満載だ。
どなたか、??のところを教えてください。



376:デフォルトの名無しさん
07/09/05 21:41:15
バイナリーを読む場合ポインタTOストラクチャを使うC#に対してVBは一発で入るよ?

同じかな?

377:デフォルトの名無しさん
07/09/05 21:43:47
>375
それなら2005を買ってみな。
ヘッダ読めばそのまま動く

378:デフォルトの名無しさん
07/09/05 21:48:34
すまない、ちょっと言葉が足りなかった
使いたいライブラリをC++でインクルード

コンパイル

C#で参照設定
.NETプロジェクト

これで全部使える

379:デフォルトの名無しさん
07/09/05 21:52:49
VB.NETでラッピングする場合は、DECLAREで定義。引数は全てVARIANTのFIXEDARRAY
(OBJECTだと通らないから注意)
で、きちんとした型をCTYPEで渡せば動作する

楽じゃないか?

380:デフォルトの名無しさん
07/09/05 21:56:22
>>375
>マネージドであるC++/CLIからは、C++/Native のオブジェクトをnewできるし、

ネイティブのライブラリは実はCのランタイムライブラリが裏で色々サポートしているので
newの部分だけ見てても混乱するよ。

内部でCRTヒープ使ってるかもしれないし、
atexitみたいなコールバックに依存しているかもしれない。

一般論として、Cのライブラリは静的リンクなり動的リンクなりのCRTを必要とする。
そのCRTとの連携無しに、C#から
直接Cのコード使おうってのはちょっと無謀じゃないかな。

相手がDLLの場合、LoadLibraryされたときに自分でCRTの初期化やるから
その辺気にする必要はないんだけど。

381:デフォルトの名無しさん
07/09/05 23:44:08
んん? そのためのC++/CLIなんだから、CRTのルールを守らず
アセンブリをロードするとは思えんけど。

URLリンク(msdn2.microsoft.com)(VS.80).aspx

382:デフォルトの名無しさん
07/09/05 23:50:54
>>381
C++/CLIはそれでOK。そこは同意。

よく分からないのは359が言うところのクラスライブラリが
どんなファイル形式なのかかな?

1) *.h 単体 (テンプレートライブラリ)
2) *.h+*.lib
3) *.h+*.obj
4) *.h+*.dll
5) *.h+*.cpp

>>>359
>いちどC++/CLIでラップしなければいけないのかどうか、知りたかった。
とか書いている割に、どんな形態で配布されているライブラリなのか
未だに明かしていないみたいだけど。

383:359
07/09/06 01:46:34
>>382
わかりにくくてすんません。一番最初にあげたurlの記事の内容そのまんまで、
WIN32で書いてあるスタティックのライブラリ。
2) *.h+*.lib
ってことになります。
URLリンク(www.atmarkit.co.jp)
で、このとおりやってみようと思ったのだが、
>>375
で書いたとおり、メンバ関数をラップするだけじゃ足りなくて、
その他もろもろ細かいところすべて書き換えなきゃならなくなって。。。
ホントにこれが普通の方法なのか?もっとエレガントな方法があるのでは。
と、思ったのでした。
ちなみに、すべてではないですが、
4) *.h+*.dll
の形にしたものもあります。
MFC,ATL,stlは使っていなく、CRTは使っているものとそうでないものが。

>>380 >>381
Nativeと.NET、両方が扱える言語は、C++/CLIだけで、
っていうか、C++/CLIはそのために存在している。ので、いまこそ使うときだ。
ってことですかね。


384:359
07/09/06 02:01:14
>>370 >>379
VB.NETはまったく未開の地だ。ちょっとみてみる。ありがとう。

>>377 >>378
ん。COMの話?


385:デフォルトの名無しさん
07/09/06 11:42:05
どうもデリゲートの使いどころがわからないんですが
イベントのメソッドはわかるんですが
おーデリゲートってすげー!!!
っというような使用法ってどういうのですかね


386:デフォルトの名無しさん
07/09/06 11:48:38
//List<int> list;
list.Sort(delegate(int x, int y){return y.CompareTo(x);});//逆順ソート

387:デフォルトの名無しさん
07/09/06 12:18:08
>>385
そもそもイベントはdelegateのシンタックスシュガー似すぎな一ツーの


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4329日前に更新/133 KB
担当:undef