2006年10月30日

.Net Remotingで CAO

   このエントリーをはてなブックマークに追加 Clip to Evernote
.Net Remotingで CAO(Client Activate Object) を利用したいのだが、IISでホストすることはできないのかな?
調べたけれど、.configファイルの書き方が良くわからない。
SingletonやSingleCallはOKなのでが、CAOはやはりだめなんだろうか。
ステートレスが前提のHTTPプロトコルで、ステートフルの処理をやろうというのが、そもそもの間違いのような気もするが...  

Posted by gushwell at 21:29Comments(5)TrackBack(0)

2006年10月26日

ReadOnlyCollectionBaseで読み取り専用コレクションを

   このエントリーをはてなブックマークに追加 Clip to Evernote
ReadOnlyCollectionBaseを使えば、C#で読み取り専用のコレクションクラスを比較的簡単に作れる。
こんな感じ。
public class ReadOnlyCollection<T> : System.Collections.ReadOnlyCollectionBase {
public ReadOnlyCollection(IList<T> sourceList) {
foreach ( T o in sourceList ) {
InnerList.Add(o);
}
}

public T this[int index] {
get { return ((T)(InnerList[index])); }
}

public int IndexOf(T value) {
return (InnerList.IndexOf(value));
}

public bool Contains(T value) {
return (InnerList.Contains(value));
}
}

使い方は、インスタンス生成がちょっと面倒だけれど、安全性は高まる。
ReadOnlyCollection<char> list = new ReadOnlyCollection<char>(
new char[] { 'A', 'B', 'V', 'D'} );
foreach (char c in list) {
Console.WriteLine(c);
}

当たり前だが、
list[0] = 'A';
のようなコードはコンパイルエラーになる。  
Posted by gushwell at 21:24Comments(2)TrackBack(0)

2006年10月24日

<configSections> 要素は、<configuration> 要素の最初に書く

   このエントリーをはてなブックマークに追加 Clip to Evernote
MSDNフォーラムの質問で思い出した以前やった失敗。

<configSections>
<sectionGroup name ="myApp.settings">
<section name="mySection1"
type="Gushwell.MyAppSection, MyAppSectionLib"/>
</sectionGroup>
</configSections>

のような記述を、App.Configに書いたのだけれど、

「構成システムを初期化できませんでした。」

というエラーがでてしまう。しばらくこのエラー原因がわからずに時間を使ってしまいました。
いろいろ、調べて、 要素は、 要素の最初に書かないといけないことがわかりました。

でも、例外のスナップショットのInnerException を見ていれば、もっと早く解決できた問題でした。

InnerExceptionのMessageプロパティには、ちゃんと以下のメッセージが設定されていました。

"config ファイルにつき 1 つの 要素のみが許可されます。要素が存在する場合、ルート 要素の最初の子でなければなりません。

教訓:
例外が出たときは、必ず、InnerExceptionの内容を確認しよう。  
Posted by gushwell at 21:14Comments(2)TrackBack(0)

2006年10月23日

Thunderbird

   このエントリーをはてなブックマークに追加 Clip to Evernote
複数のメールアカウントを持っている場合、送信のSMTPサーバーもそれぞれ別にしたいのだけれど、Thunderbirdの設定方法がすぐには分からず悩んでしまった。
SMTPサーバーの設定ダイアログで、複数のアカウントを登録できることはすぐに分かったのだけれど、どうやって、各アカウントに紐付けるのかがわからない。
このダイアログに、
「アカウントを複数お持ちの場合でも、設定が必要な送信(SMTP)サーバーは一つだけですメッセージ送信に使用するサーバー姪名を入力してください」
なんて、表示されているから余計だ。


いろいろさわって、「アカウント設定」ダイアログに SMTPサーバの設定欄があったのを発見。発見というほど大げさなものではないが。。。
でも、この場所が分かりにくいし、コンボボックスで選択するってのも分かりにくい。
確かに、コンボボックスのほうがすばやく選択できるのだけれど、「選択」ボタンがあったほうが、迷わなくて済むと思う。


  
Posted by gushwell at 08:00Comments(0)TrackBack(0)

2006年10月20日

C#の構造体をbyte配列に

   このエントリーをはてなブックマークに追加 Clip to Evernote
例えば
 [StructLayout(LayoutKind.Sequential)]
struct MyRecord {
public int number1;
public ushort number2;
public ushort number3;
}

のような構造体があった時に、この内容をbyte配列に変換したいのだが、unsafeなコードを使わないで、これを実現する方法ってあるんだろうか?
C言語だったら、char型のポインタへキャストして、memcpyして終わりなんだけれど、C#でこれを安全にやる方法ってのがよくわからない。
シリアライズとか使えればいいんだけれど、今回は事情があって使えない。

いろいろ、悩んだ結果、BitConverterクラスで一つ一つ変換することにした。
  byte[] bytes = BitConverter.GetBytes(rec.number1);
Array.Copy(buffer, 0, bytes, 0, bytes.Length);
...

うーん、かなり力技だけどまあいいか。  
Posted by gushwell at 00:17Comments(4)TrackBack(0)

2006年10月18日

GMail

   このエントリーをはてなブックマークに追加 Clip to Evernote
あまりにも迷惑メールが増えすぎたため、GMailのアドレスを取得し、既存のメールアドレスに来たメールをGMailアドレスに転送し、GMailのサーバーに迷惑メールのフィルタリングをしてもらうことにしました。
でも、僕が愛用しているメーラー:EdMaxだと、GMailの受信ができないじゃないですか。
EdMaxはキビキビ動くのでとても重宝していたのですが困りました。

stunnel というソフトを使えば、SSL非対応メーラをSSL化できるようなのですが、非力なPCにさらに常駐ソフトを入れるのは嫌だしな。

泣く泣くThunderbird に乗り換えることにしました。そうすれば、PopFileも不要になるし。


  
Posted by gushwell at 22:40Comments(0)TrackBack(0)

2006年10月16日

.NET リモーティングオブジェクトをWindowsServiceでホストする方法

   このエントリーをはてなブックマークに追加 Clip to Evernote
.NET リモーティングオブジェクトをWindowsServiceでホストする方法は、WindowsServiceの作り方を知っていれば、とても簡単だ。

 protected override void OnStart(string[] args) {
RemotingConfiguration.Configure(
AppDomain.CurrentDomain.SetupInformation.ConfigurationFile,false);
}

と書くだけだ。
でも、サービスでリモート オブジェクトをホストする方法には、

サービスの構成ファイルのフルパスをサービスのプロパティ [開始パラメータ] ボックスに入力し、

RemotingConfiguration.Configure(args[0]);

と書くように説明している。
構成ファイルを自由に置き換えることが可能だけれど、普通は、そういった要求はほとんどないと思う。
やはり、前者の方法で十分だと思う。

ところで、.NET Framework2.0になって、Configureメソッドも書き方が変更になっていますね。
  
Posted by gushwell at 21:12Comments(0)TrackBack(0)

2006年10月11日

Settings.Designer.csの接続文字列で嵌った

   このエントリーをはてなブックマークに追加 Clip to Evernote
また、やらかした。
前にも同じ間違いをして、悩んだことがあったのに、またしても同じ間違いで時間をつぶしてしまった。。。

ADO.NETを使ったプログラムで、データベースサーバーを個人的に利用している開発サーバーからテストサーバーに移したら、データベースに接続できなくなってしまった。

---
サーバーへの接続を確立しているときにエラーが発生しました。SQL Server 2005 に接続しているときにこのエラーが発生した場合は、SQL Server の既定の設定がリモート接続を許可しないようになっていることがエラーの原因である可能性があります。
---

ここで出るメッセージが不適切なので、原因を特定するのに余計に時間がかかってしまった。

ちゃんと、リモート接続許可はしているし、App.configの接続文字列も変更しているのになぜ???

原因は、App.configの

<connectionStrings>
<add name="Gushwell.Properties.Settings.MyConnectionString"
connectionString="Data Source=....."
providerName="System.Data.SqlClient" />
</connectionStrings>

の、nameの文字列だった。

DataSetを作成してから、プロジェクトの既定の名前空間を変更したのが、問題だったようだ。

DataSetの名前空間と、Settings.Designer.cs の名前空間は、既定の名前空間名に自動的に変更されるのだけれど、それに対応して、App.Configの 上記name 文字列は変更されないのだ。

例えば、Gushwell という既定の名前空間を Gushwell.Dataと変更すると、.cs ファイルの名前空間は、Gushwell.Data に変わるのに、App.Configの name 文字列はそのままになっている。

そうなると、configに記述された文字列が取得できないため、Settings.Designer.csに記述された DefaultSettingValueAttribute 属性の接続文字列が使われることになる。

ここは、開発用マシンの接続文字列が埋め込まれているため、データベースへの接続に失敗するというわけ。

結論
「型付きDataSetを使うプログラムでは、名前空間を変更したら、App.configも変更しないといけない」
  
Posted by gushwell at 21:30Comments(0)TrackBack(0)