2008年1月31日木曜日

[.NET]ActiveX(com)呼び出し(その2)

先日の、[.NET]ActiveX(com)呼び出し では、DLLから生成したアセンブリを配布するのがメンドウと書きましたが、以下のような方法で解決してみました。
  1. TLBIMP でアセンブリを生成
  2. Reflector for .NETで↑を逆コンパイル
  3. ↑でリバースしたソースを元に、コーディング

簡単に言うとTLBIMPのなかでやっていることを手動でやってみた。ってことです。GACにしてもおそらく問題は無いと思いますが、今度ためしてみよう。

(注)ここでの逆コンパイルは自作のライブラリから抽出したアセンブリを対象としてます。逆コンパイル自体法に触れる場合がありますので、問題が無いものを対象にしてください。

2008年1月30日水曜日

[.NET]ActiveX(com)呼び出し

.NET Frameworkでは、COMを呼び出す方法として、以下の2種類が用意されています。
  1. TLBIMP によるメタデータの変換
  2. COM コンポーネントの直接の使用

どちらを選択しても非常に簡単です。で、「1.」のほうが、楽といえば楽なんですが、複数のアセンブリから呼び出すようにすることを考慮すると、「2.」の方法よりよいと思います。

「2.」の方法をとった場合、考えられるのは共通ライブラリです。それはGACも含みます。しかし、タイプライブラリというか、COMから抽出したアセンブリを同時に配布しなければなりません。コレをGACにするには、署名したりなんだかんだで結構メンドクサイ。

何かいい解決方法があればいいんですが。。。

2008年1月28日月曜日

[ASP.NET]cookieの確認方法

@itの掲示板にASP.NETでcookieを確認したい場合の荒技が紹介されてたのでメモ。

IEの場合、アドレスバーに、

javascript:document.cookie;

って打ち込むだけ。
まぁそれはそうなんですが、なかなかそういう発想にはなりません。。。

2008年1月23日水曜日

[.NET]interfaceのインプリメント

C#やJavaなどオブジェクト指向言語の大半は、Interfaceという機構を持ちます。
C#の場合、以下のようになります。

public interface Interface1 { int getData(); }


コレをインプリメントすると、

public class Imple1 : Interface1
{
    public int getData() { return 1; }
}


のようになります。Interfaceは複数インプリメントできるので、

public class Imple1 : Interface1Interface2{...}


のように実装することができます。ところが、この複数のインタフェースで

  • メソッド名が同じ
  • 引数が同じ
  • 戻り値が異なる

といったオーバーロードが発生するケースがあります。この場合、C#では



public class Imple : Interface1Interface2
{
    int Interface1.getData() { return 1; }
    string Interface2.getData() { return "1"; }

    public long getData()
    {
        return 1L;
    }
}


のようにして解決します。で、使うほうはというと、そのタイプにキャストして実行することになります。

Imple imp = new Imple();
long l = imp.getData();
int i = ((Interface1)imp).getData();
string s = ((Interface2)imp).getData();


知りませんでした。。。

2008年1月22日火曜日

[.NET]StringBuilder

文字列を連結する場合、.NETではStringBuilderを使います。
で、改行を入れたい場合、以下のように書きます。

StringBuilder sb = new StringBuilder();
sb.Append("ABC").Append("\n");
sb.Append("DEF").Append("\n");


最近あるサイトで見かけたのですが、実は改行つきのメソッドがあります。こんなかんじ。

StringBuilder sb = new StringBuilder();
sb.AppendLine("ABC");
sb.AppendLine("DEF");


こっちのほうがスマートですね。ほかにも、AppendFormatというのがあります。
メソッド名よりわかると思いますが、String.Formatと同等ですね。

2008年1月15日火曜日

[他]MSDN

最近VS2008がリリースされたせいか、MSDNのリンク切れが多々あります。
とある情報を検索し、その際とにMSDNへのリンクがありそれを押下すると、「コンテンツが見つかりません」ページに遷移します。ちょっとイラっときます。
しかし、コレといってよい回避策が見つかりません。。。

2008年1月1日火曜日

[NET]アプリケーションセッティングとユーザセッティングの保存(その2)

以前「GDD Blog: [.NET]アプリケーションセッティングとユーザセッティングの保存」でxxx.exe.confingのシステム設定は保存できない。というブログ書きましたが、比較的?簡単な方法で保存する方法を見つけました。

ExeConfigurationFileMap map = new ExeConfigurationFileMap();
map.ExeConfigFilename = Application.ExecutablePath + ".config";
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(mapConfigurationUserLevel.None);
SettingElementCollection settings = ((ClientSettingsSection)(config.SectionGroups["applicationSettings"].Sections[0])).Settings;

//ここで設定した値が以下のSaveで保存される
settings.Get("キー").Value.ValueXml.InnerText = "値"

dataGridView1.Columns[1].DefaultCellStyle.Format = "";
config.Save(ConfigurationSaveMode.Minimal,true);


えぇまぁ強引なやり方です。
しかし、この方式だと、configの最後に

<system.web>
    <trust level="Full">
    <webcontrols clientscriptslocation="/aspnet_client/{0}/{1}/">
</system.web>


というのがついてしまいます。この辺が気になる人にはつかえませんが、許せる人は参考までに。