トップページ⇒tech
1001コメント299KB

C#, C♯, C#相談室 Part42

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/08/26(日) 12:42:25
(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。

前スレ
C#, C♯, C#相談室 Part41
http://pc11.2ch.net/test/read.cgi/tech/1184840053/

過去スレは>>2-5あたり。
0552デフォルトの名無しさん2007/09/13(木) 08:01:59
キーと値に同じの突っ込んどけ
0553デフォルトの名無しさん2007/09/13(木) 10:52:29
>549
>550
すみません。メッセージが間違ってました

「DLL 'aaa.dll'を読み込めません:指定されたモジュールが見つかりません。」
でした。
ちなみにDLLはexeと同じフォルダに置いています。
BCBで作ったプログラムからは呼び出しできます。
0554デフォルトの名無しさん2007/09/13(木) 12:05:07
Releaseに置いてたりして
0555デフォルトの名無しさん2007/09/13(木) 12:07:22
DLLをフルパスで指定して見るとか
0556デフォルトの名無しさん2007/09/13(木) 12:10:19
Winアプリを作成しております、相談にのって下さい。

環境:
   WindowsXP Professional SP2
   VisualC# 2005
   .net framework2.0

やりたいこと:
   TextBoxにフォーカスがあるときはTextBoxのBorderStyleプロパティをFixed3Dに、
   フォーカスが無いときはBorderStyleをNoneにする。
   開発全体でこの動作を多用するので、カスタムコントロールとして作成したい。

とりあえずTextBoxを継承したカスタムコントロールを作成しました。
OnEnterでBorderStyle=Fixed3Dに、
OnLeaveでBorderStyle=Noneにするよう記述し動作を確認したところ、
マウスでの移動は思ったとおりに動作するのですが、
Tabキーでの移動が出来ません。(フォーカスが次のコントロールに移らない)
エラーなどは特に出ません。
0557デフォルトの名無しさん2007/09/13(木) 12:11:26
>>556の続き
BorderStyleではなくBackColorプロパティの変更ではTab移動が出来ました。
調べてみたところ、BorderStyleだけでなく、
TextAlignでも同様の不具合が発生するようです。

http://dobon.net/vb/bbs/log3-18/10725.html
>OnEnter / OnLeave で TextAlign プロパティの値を変更すると
>Tab キー操作によるフォーカス移動に支障を来たす

この不具合の回避方法か、
別の方法での機能の実装をご存知の方がいましたら
教えて下さい。
0558デフォルトの名無しさん2007/09/13(木) 12:13:46
>>557の続き 長々すいません
ソース抜粋:
namespace CustomControl
{
  public partial class TextBoxEx : TextBox
  {
    public TextBoxEx()
    {
      InitializeComponent();
    }
    protected override void OnEnter(EventArgs e)
    {
      this.BorderStyle = BorderStyle.Fixed3D;
      base.OnEnter(e);
    }
    protected override void OnLeave(EventArgs e)
    {
      this.BorderStyle = BorderStyle.None;
      base.OnLeave(e);
    }
  }
}
0559デフォルトの名無しさん2007/09/13(木) 12:36:36
>554
それはないです。

>555
やってみましたが、DLLの名前がフルパスで表示される以外
メッセージは変わりませんでした。
0560デフォルトの名無しさん2007/09/13(木) 12:39:02
>>558
BorderStyleを変更するとハンドルが再作成されるからじゃね?
ToolStripTextBoxの内部のコントロールの実装を調べてみたらどうか
0561デフォルトの名無しさん2007/09/13(木) 13:36:30
>>559
もともとの質問であるC#からDLLの呼び出し方なら、>>548で問題ない。
だから、DLLが見つからないのは、環境やパスの問題が一番怪しい。
たとえば>>554とか。

自分のプロジェクトとファイル構成をもう一度じっくり見直したほうがいいと思う。
あと、dllと同じフォルダにあるexeをエクスプローラから直接起動してもだめ?
0562デフォルトの名無しさん2007/09/13(木) 13:46:26
>561
>自分のプロジェクトとファイル構成をもう一度じっくり見直したほうがいいと思う。
見直してみる。

>あと、dllと同じフォルダにあるexeをエクスプローラから直接起動してもだめ?
ダメだった。
0563デフォルトの名無しさん2007/09/13(木) 13:52:16
>>558
引用先に書いてある通り内部でWindowを再作成してるのが原因だろう。
ディスパッチャーに乗せてスタイルの変更処理を遅延させてみた。
一応動いているがタイミングの問題が残るかもしれない。
delegate void ChangeBorderStyleHandler();
protected override void OnEnter(EventArgs e) {
  base.OnEnter(e);
  this.BeginInvoke(new ChangeBorderStyleHandler(ChangeBorderStyleFixed3D));
}
protected override void OnLeave(EventArgs e) {
  base.OnLeave(e);
  this.BeginInvoke(new ChangeBorderStyleHandler(ChangeBorderStyleNone));
}
private void ChangeBorderStyleFixed3D() {
  this.BorderStyle = BorderStyle.Fixed3D;
}
private void ChangeBorderStyleNone() {
  this.BorderStyle = BorderStyle.None;
}
0564デフォルトの名無しさん2007/09/13(木) 13:58:25
>>562
今試したけど普通に呼べた
aaa.cpp (DLL側)
----------
#include <tchar.h>
#include <windows.h>
extern "C" __declspec(dllexport) UINT FunctionA(){
MessageBox(NULL, _T("hello"), _T("test"), MB_OK);
return 0;
}
a.cs (呼び出し側)
----------
using System.Runtime.InteropServices;
public class C {
[DllImport("aaa.dll")]
private static extern uint FunctionA();
public static void Main() {
FunctionA();
}
};
これで作成したDLLとEXEを同じフォルダに置いて実行すると、正しくメッセージが表示された
試しに新しいプロジェクト作って上のコード打ち込んで、動作するか試してみたら?
0565デフォルトの名無しさん2007/09/13(木) 15:17:52
>564
VCで作ったDLLなら普通に呼び出せるけど、BCB5だとダメみたい。
違う方策を考えたほうがいいのかも...
0566デフォルトの名無しさん2007/09/13(木) 16:46:56
>>548
aaa.dll が依存している他の dll が無いだけ。
DependancyWalker (depends.exe) で調べて見れ
0567デフォルトの名無しさん2007/09/13(木) 16:56:41
>>560
>>563
ありがとうございました。

>>563の方法で何とかなりそうなので、
これで進めようと思います。
0568デフォルトの名無しさん2007/09/13(木) 17:09:36
ToolStripItemをオーバーフローしない程度にコンテナ(ToolStripなど)内でサイズ最大化したいのですが、
どうすればよいでしょうか?
05695482007/09/13(木) 17:38:58
>566
調べました。
最初「msjava.dll」がないって言われたから、全然関係なさそうだったけど
探して入れましたが結局ダメでした。
ムムム
0570デフォルトの名無しさん2007/09/13(木) 18:31:36
>>569
msjava.dllは関係ないだろ
ちょっとググっただけでも、BCBで作成したアプリには
cc3250mt.dll
borlandmm.dll
vcl50.bpl
みたいなランタイム(バージョンによって違う)が必要っぽい気がするけど、
この辺は大丈夫なのか?
05715482007/09/13(木) 19:43:58
>570
>この辺は大丈夫なのか?
当然大丈夫であります。
0572デフォルトの名無しさん2007/09/13(木) 20:24:44
ドトネト以外からは使えるのか?
0573デフォルトの名無しさん2007/09/13(木) 21:01:45
ConfigurationSection を継承してカスタム構成情報クラスを作ったけど、
更新した後に Configuration.Save() するタイミングで、「ロックされて
いるのでうんぬん」という例外が発生する。このロックは解除できないもの?
0574デフォルトの名無しさん2007/09/13(木) 21:07:11
単に読込みの時にストリーム閉じきっていないのでは?
05755482007/09/13(木) 21:53:16
>572
BCB5からは呼び出せます。
0576デフォルトの名無しさん2007/09/13(木) 22:05:49
えっBCB5のものは呼び出せないでしょ

メーカー違うとだめじゃない?
delphiでも苦労した覚えが…
0577デフォルトの名無しさん2007/09/13(木) 22:08:11
ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=12985&forum=7
0578デフォルトの名無しさん2007/09/13(木) 22:15:32
C#のWindowsアプリケーションプロジェクトを新規作成して
FormのPaintイベントハンドラを
private void Form1_Paint(object sender, PaintEventArgs e) {
// e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
e.Graphics.DrawString(
"fffffffffffffffffffffffffffffffffffffffffffff", Font, Brushes.Black, 0, 0
);
}
として実行すると表示される文字列の右の方が寸詰まりな感じになります.
コメントアウトしてあるTextRenderingHintの行を有効にすると寸詰まりになりません.
皆さんの環境でも同様でしょうか?
できれば寸詰まりして欲しくないのですが対処方はないでしょうか.
05795782007/09/13(木) 23:23:25
TextRenderer#DrawText()だと寸詰まりしないようですのでこちらを使って見ます.
でもDrawString()よりだいぶ遅いです・・・.
05805482007/09/14(金) 00:51:25
>577
解決しました。
関数に「WINAPI」をつけたらうまくいきました。
Win32APIの呼び出し規約で、呼び出される関数には「_stdcall」が必要のようです。

ありがとうございました。
0581デフォルトの名無しさん2007/09/14(金) 02:31:09
ハードディスクを交換しようとしています。
起動しているOSのドライブを丸ごとコピーするプログラムをC#
でかけますか?
0582デフォルトの名無しさん2007/09/14(金) 02:47:19
はい
0583デフォルトの名無しさん2007/09/14(金) 13:58:23
そんなもんわざわざ自分で作らなくても探せばどこにでも転がってます
0584デフォルトの名無しさん2007/09/14(金) 14:04:02
書けないとでも思ってるのか?
0585デフォルトの名無しさん2007/09/14(金) 14:12:50
C#で書いたらWindowsインストールしないとデータ復旧できないよな
できるけど実用性は0だ
0586デフォルトの名無しさん2007/09/14(金) 15:03:54
MONOで動けばなんとか……
0587デフォルトの名無しさん2007/09/14(金) 15:09:49
ttp://www.symantec.com/ja/jp/home_homeoffice/products/overview.jsp?pcid=br&pvid=ghost12
0588デフォルトの名無しさん2007/09/14(金) 23:27:35
ObjectDataSourceのSelect操作やDelete操作に割り当てるメソッドの型はなぜstaticで組むのが一般的なのでしょうか?
ASP.NETの場合、スレッドセーフにならないのではと思って私はあえてstatic宣言していません。
それでも使えるからです。
なぜMSDNなどではstaticでメソッドを宣言しているのでしょうか?

0589デフォルトの名無しさん2007/09/14(金) 23:38:56
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdnvs05/htm/ASP2.0/gridview/GridViewEx05.asp
0590デフォルトの名無しさん2007/09/14(金) 23:41:41
>>588
おれも、それ疑問だったよ。
静的メソッドじゃ同時アクセスしたりしたら、別セッションから変数の値が書き変わっちゃうことがあるよね。
ロックしているとしたらあまりパフォーマンス的にいいことじゃないしな。
0591デフォルトの名無しさん2007/09/14(金) 23:52:14
C#で書いたアプリってVB6で書かれたアプリよりももっさりとしかも遅いんでしょうか?
0592デフォルトの名無しさん2007/09/14(金) 23:57:26
staticかどうかとスレッドセーフって関係あんの?
0593デフォルトの名無しさん2007/09/14(金) 23:57:27
君が使ったら何使っても遅いと思うよ
0594デフォルトの名無しさん2007/09/14(金) 23:59:15
遅いよ
0595デフォルトの名無しさん2007/09/14(金) 23:59:58
>>593
負け惜しみw
0596デフォルトの名無しさん2007/09/15(土) 00:04:01
>>588
>>590
よく理解もしてないのにスレッドセーフとかそうじゃないとか思い込みで判断しないほうがいいよ。
ObjectDataSourceみたいな使い方で、どうして静的メソッドだとスレッドセーフじゃなくてインスタンスメソッドだとスレッドセーフだと思うの?

>静的メソッドじゃ同時アクセスしたりしたら、別セッションから変数の値が書き変わっちゃうことがあるよね。
どういうこと?

>ロックしているとしたらあまりパフォーマンス的にいいことじゃないしな。
何をどうロックすると考えられるわけ?
0597デフォルトの名無しさん2007/09/15(土) 00:05:59
スレッドとかスレッドセーフとかASP.NETでのスレッドの動作とか
いろんなことちゃんと理解してたら、>>590みたいな発想はしないと思うけどな。
0598デフォルトの名無しさん2007/09/15(土) 00:07:03
>>596
あー、素人は黙ってようね
0599デフォルトの名無しさん2007/09/15(土) 00:09:38
素人って…

っていうかなぜstaticだとスレッドセーフじゃないのかいってみろ。
0600デフォルトの名無しさん2007/09/15(土) 00:15:35
>>598
はやくいえよボケ
0601デフォルトの名無しさん2007/09/15(土) 00:17:07
俺じゃねーけど早く言って♥
0602デフォルトの名無しさん2007/09/15(土) 00:19:49
>>601
日本語でおk
0603デフォルトの名無しさん2007/09/15(土) 00:20:43
そんなこといってると普通なら必要もないのに
無理やりstaticメンバ変数をいじって
正常に動かない例を出されるぞw
0604デフォルトの名無しさん2007/09/15(土) 00:21:40
スタティック変数を持つ関数がスレッドセーフじゃないことと取り違えている馬鹿?
0605デフォルトの名無しさん2007/09/15(土) 00:22:16
つまり>>601は>>599であり>>600ではなくて
暴言は吐いたりしたのは俺じゃないけど
早く言ってとは思ってことではなかろうか。
0606デフォルトの名無しさん2007/09/15(土) 00:23:55
staticメンバを複数スレッドから扱っておかしくなるという
例示だけを記憶してて、きちんと意味を理解せずに
staticはスレッドセーフじゃないと安直に思い込んでる

といったところだろ、どうせ。
0607デフォルトの名無しさん2007/09/15(土) 00:28:38
>>599-600
なぜそんなに切れてるんだ
0608デフォルトの名無しさん2007/09/15(土) 00:31:52
>>600は>>599じゃないやい。

>あー、素人は黙ってようね
つまらんことだけ言ってるから理由をちゃんと言えってだけだよう。
0609デフォルトの名無しさん2007/09/15(土) 00:32:42
staticでも適切なコード書けばスレッドセーフなんです
0610デフォルトの名無しさん2007/09/15(土) 00:33:44
>>608
なんでそんなに必死なの?
0611デフォルトの名無しさん2007/09/15(土) 00:35:04
そもそもstaticだろうがインスタンスだろうが、
単一のメソッドで処理が完結するような場合など
状態情報を維持する必要がないようなメソッドは
最初からスレッドセーフだ。

っていうか複数スレッドで競合する部分がそもそもないし。
0612デフォルトの名無しさん2007/09/15(土) 00:35:40
>>610おまえ>>598だろw
0613デフォルトの名無しさん2007/09/15(土) 00:37:06
>>610
「素人」って言葉が痛かったとかw
0614デフォルトの名無しさん2007/09/15(土) 00:38:37
>>612
俺は607と610だけですがなにか?
0615デフォルトの名無しさん2007/09/15(土) 00:44:07
とりあえずvolatile知らない奴はレスするなよ
0616デフォルトの名無しさん2007/09/15(土) 00:56:33
>>609
適切なコードを書かなければスレッドセーフじゃないんでしょ。
だから適切なコードは何で適切じゃないコードはなんなの?
ASP.NETはstaticなメソッドなんか書いたら、その中で使われる変数とか
他のセッションからでも共用されちゃうでしょ?
0617デフォルトの名無しさん2007/09/15(土) 01:01:26
>ASP.NETはstaticなメソッドなんか書いたら、その中で使われる変数とか
>他のセッションからでも共用されちゃうでしょ?

どんな変数使う気だ?
これはそもそもObjectDataSourceみたいなやつの
メソッドの話だよな?
0618デフォルトの名無しさん2007/09/15(土) 01:03:30
適切なコード書かなきゃインスタンスメソッドでも
スレッドセーフにはならんだろ
0619デフォルトの名無しさん2007/09/15(土) 01:47:23
いっつも本題から外れていくな…
なぜstaticなの?
0620デフォルトの名無しさん2007/09/15(土) 01:55:40
staticで困らんからだろ。
インスタンスにする必要もないからだろ。
0621デフォルトの名無しさん2007/09/15(土) 01:57:27
例えばMathクラスのメンバが全部インスタンスメソッドだったらどう思うよ。
そこまで極端じゃないにせよ、
0622デフォルトの名無しさん2007/09/15(土) 01:59:04
すまん>>621の続き
特にObjectDataSourceの使い方じゃ本質的にはそれと変わらんてこと。

Mathのメソッドがstaticだからって、スレッドセーフなのかとか、
ロックされててパフォーマンスが悪いんじゃないかとkじゃ思うかね?
0623デフォルトの名無しさん2007/09/15(土) 03:44:25
思いません先生!!
0624デフォルトの名無しさん2007/09/15(土) 05:14:29
asp.net使ったこと無いからよくわからないが、インスタンス化するとメモリー消費量がバカにならないから
スタティックで済むならスタティックで書けってことじゃね
0625デフォルトの名無しさん2007/09/15(土) 05:34:47
フィールドに一切アクセスしないprivateメソッドを書くとき、staticにしたほうがメモリを節約できるかも、という考えが脳裏をよぎることもある。
0626デフォルトの名無しさん2007/09/15(土) 07:13:43
ObjectDataSourceが呼び出すSelectMethod/UpdateMethod/InsertMethod/DeleteMethodは
基本的にステートレスで作れってこと。ステートレスなら基本的にスレッドは気にしなくてよい。
staticを使わない場合はメソッドを呼び出すごとにインスタンスを作って終わると破棄する
SingleCallモデルになっている。
一般的にはSingletonが用いられるケースなんだろうけどMSはなぜかあまり使いたがらないね。
0627デフォルトの名無しさん2007/09/15(土) 10:27:36
>>625
どんな理屈だw
0628デフォルトの名無しさん2007/09/15(土) 11:04:58
>>627
C++のメンバ関数の実装を想像して、thisポインタの分が節約できるかも、と考えたが
CLRだと変わらないんだっけ?
0629デフォルトの名無しさん2007/09/15(土) 11:04:59
>>625
普通にFxCopとかでstaticにしろやって言われるやん
0630デフォルトの名無しさん2007/09/15(土) 11:13:16
>>626
ファクトリとか指定できるようになってたらSingletonにしたりとかもっといろいろできるんだけど、
フレームワーク側で勝手にシングルトンはできてもあまりうれしくもないと思う。
0631デフォルトの名無しさん2007/09/15(土) 12:31:17
object obj = new object();
の時、下の2つは何が違うんですか?
function(obj);
function(ref obj);

参照型の場合refありもなしも変わらないんですか?
0632デフォルトの名無しさん2007/09/15(土) 12:35:12
void function( object obj )
{
 obj = new NewObject();// このメソッド内でしか意味がない
}

void fuction2( ref object obj )
{
 obj = new NewObject();
}

object obj = new object();
function(obj);   //何もおこらず
function2(ref obj); //objはもう昔のobjじゃないわ
0633デフォルトの名無しさん2007/09/15(土) 12:35:14
呼び出し先で obj に代入したときの動作
06346312007/09/15(土) 12:41:52
なるほど。ありがとうございます。
関数内でnewしない場合は関係ないんですね。

関数内で参照先の値を変更するだけで、newしない場合も
コード的には明示的にrefをつけといた方がいいんですかね?
もしくは参照型を引数にとる関数で引数にrefをつける=関数内で新たにnewしちゃう関数なんだぜ!
て意味合いがあるんですか?
0635デフォルトの名無しさん2007/09/15(土) 12:43:58
標準のクラスライブラリに ref つきのメソッドがどれほどある?
0636デフォルトの名無しさん2007/09/15(土) 12:44:31
void fun01(int x) { x = 2; }
void fun02(ref int x) { x = 2; }

int foo = 1:
fun01(foo);    // foo の値は 1 のまま
foo02(ref foo);   // foo の値は 2 に変わる
0637デフォルトの名無しさん2007/09/15(土) 12:45:22
たしかに。。
ではrefなしで行きたいと思います。
ありがとうございました〜
0638デフォルトの名無しさん2007/09/15(土) 12:55:03
refなんてめったに使わん。
フレームワークなど基盤部分で値型を扱う際に、
内部的に使うことはあるかもしれんが。

0639デフォルトの名無しさん2007/09/15(土) 13:03:27
必要もないのに使うべきでないのは確かだが、
教条主義的に否定する馬鹿にはならないで欲しいな。
この業界そういう馬鹿が案外多いから
0640デフォルトの名無しさん2007/09/15(土) 13:10:37
も一個質問なんですけど、
privateな関数で、メンバ変数、メンバ関数に一切アクセスしない場合
private staticにしたほうがいいんですか?
staticつきでも、なしでも動作は同じなんですけど。呼び出し方が変わるくらいで。
0641デフォルトの名無しさん2007/09/15(土) 13:13:05
うん
0642デフォルトの名無しさん2007/09/15(土) 13:13:18
>>639
気をつけます!
(といっても趣味なので話す相手もいませんが。。)
0643デフォルトの名無しさん2007/09/15(土) 13:17:45
>>641
なるほど。どうもです
06447622007/09/15(土) 13:49:15
>>638
XNA Frameworkなんかパフォーマンス目的でrefやoutだらけだよ
void Matrix.Multiply (ref Matrix matrix1, ref Matrix matrix2, out Matrix result)
みたいに
0645デフォルトの名無しさん2007/09/15(土) 13:50:46
>>639
その気持ち自体はとってもよく分かるんだが、
現実は結構加減が難しくない?
自分がレビューとかできる範囲ならまだいいんだけどね〜
0646デフォルトの名無しさん2007/09/15(土) 13:53:37
>>644
実質同じこといってるような気がする。
0647デフォルトの名無しさん2007/09/15(土) 15:53:53
荒れてるねw
0648デフォルトの名無しさん2007/09/15(土) 22:31:15
ム板でスレ違いと言われたのでここにて質問させて下さい。

.NETからoracleに接続をする、つまりDB接続文字列が分かりません。

String sConnectionString = "Provider=MSDAORA;User ID=sys;password=test_pass ; Data Source =ORCL10GR2;Persist Security Info=False";

恐らく
1)Provide
2)Data Source
の部分が怪しいと思うのですが、この部分はどうすれば適切なDB接続
文字列を見つける事が出来るでしょうか?

以上 どなたかoracleに詳しい方お教え願います。
0649デフォルトの名無しさん2007/09/15(土) 22:41:23
>648
スレ違い。
0650デフォルトの名無しさん2007/09/15(土) 22:46:15
ですねw
0651デフォルトの名無しさん2007/09/15(土) 22:59:31
>>648
VS2005のメニューで「ツール」→「データベースの接続」でデータベースに接続できるなら、
サーバーエクスプローラ上の接続済みデータベースのプロパティに接続文字列が表示されるけど、
それでも駄目かな(実際にOracle使っていないので保証できないけど)?
0652デフォルトの名無しさん2007/09/15(土) 23:44:37
>>648
ttp://www.connectionstrings.com/
■ このスレッドは過去ログ倉庫に格納されています