.NET のクラスライブラリが同じパスに存在する別の DLL を動的にロードするには

動的に別のDLLをロードするときのメモ。 System.Reflection.Assembly.GetExecutingAssembly().CodeBase で自身のパスが取れる。 file:\ が先頭に付くときがあるため取り除いている。 string selfDirPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase); if (selfDirPath.StartsWith(“file:\")) { selfDirPath = selfDirPath.Substring(6); } System.Reflection.Assembly.LoadFile(System.IO.Path.Combine(selfDirPath, “Another.dll”));

2011年1月14日 · Toshimitsu Takahashi

Silverlight 4 RC の COM 機能を使って Excel に twitter 検索結果を流し込む

Silverlight 4 から Out of Browser でCOMオートメーション機能が使えるようになった。これにより Excel などの外部アプリケーションを直接呼び出し操作できるようになりました。 Silverlight 4 の出荷候補版も出たので試しに COM による Excel 連携機能を実装してみることにした。今回は作ったのは、twitter で検索した結果を Excel シートに流し込むアプリです。 開発環境 Windows 7 上の Visual Studio 2010 RC と Microsoft Silverlight 4 Tools for Visual Studio 2010 RC による ポイント COMオートメーション機能 まず COMオートメーションの機能は、βからRCになり仕様が変わっています。 AutomationFactory.CreateObject にオブジェクト名を指定してインスタンスを生成します。下記ではさらのExcelを表示して、ワークブックを追加しその最初の(アクティブ)シートを取得しています。 using System.Runtime.InteropServices.Automation; ・・・ dynamic excel = AutomationFactory.CreateObject(“Excel.Application”); excel.Visible = true; dynamic workbook = excel.workbooks.Add(); dynamic excelSheet = excel.ActiveSheet; ※ dynamic を使用するには Microsoft.CSharp の参照追加が必要です。 twitter検索 ボタンのクリックイベントでsearchTextBoxに入力されてたTextでtwitter search API をたたきます。 DataContractJsonSerializer を使って、レスポンスストリームから直接 JSON を C# 上の構造体クラスのデータオブジェクトに変換しています。ToExcelに結果オブジェクトを渡して処理をします(これは後述)。 ...

2010年3月17日 · Toshimitsu Takahashi

Visual Studio 2010 RC に Silverlight 4 Tools for Visual Studio 2010 Beta 2 を無理やり適用インストールするには

Visual Studio 2010 RC 対応版が出たので、もう下記のハックは不要です。 Microsoft Silverlight 4 Tools for Visual Studio 2010 RC Microsoft Download Center Visual Studio 2010 RC が出て半月は経ちますが、Silverlight 4 Tools for Visual Studio 2010 の RC 版がいっこうに出てきません。ということで無理やり Beta 2 版を入れる方法はないものか探していたら、ロシアの方がブログに書いていたので参考にしてやってみました。 Silverlight 4 with VS 2010 RC, Visual Studio 2010, Silverlight 4 | Alex Sorokoletov の記事を参考にやってみました。 原文が(多分)ロシア語なので記事内の「Update: Translated to English version.」のリンクで英語翻訳を見ると良いでしょう。 Microsoft Silverlight 4 Tools for Visual Studio 2010 Beta 2 を入手 http://www.microsoft.com/downloads/details.aspx?FamilyID=68a158af-9bb8-4855-a724-d09d196eaaf3&displaylang=ja: からダウンロードします。 インストールパッケージの抽出 さきほとダウンロードした Silverlight4_Tools.exe を実行します。 ...

2010年2月25日 · Toshimitsu Takahashi

圧縮パスワード付き ZIP ファイルを生成できる DotNetZip ライブラリを C# で試してみた

DotNetZip Library - Home DotNetZip は Microsoft Public License の ZIP ライブラリ プロジェクト。 試しに C# からコマンドラインでパスワード付きZIPを作成するサンプルプログラムを書いてみた。 using System; using System.IO; using Ionic.Utils.Zip; namespace AppTest { class Program { static void Main(string[] args) { string filePath = null; string zipfile = null; string password = null; for (int i = 0; i < args.Length; i++) { if (args[i] == “-p”) { password = args[++i]; } else if (filePath == null) { filePath = args[i]; } else { zipfile = args[i]; } } if (filePath == null || zipfile == null || !File.Exists(filePath)) { if (args.Length != 2) { Console.WriteLine(“Usage WhiteMole.exe [-p password] file zipfile”); } return; } try { zipAtEncrypt(filePath, zipfile, password); } catch (ZipException) { Console.WriteLine(“Failed to compress " + filePath); } } private static void zipAtEncrypt(string filePath, string zipfile, string password) { using (ZipFile zip = new ZipFile(zipfile)) { if (password != null) zip.Password = password; zip.AddFile(filePath); zip.Save(); } } } } ...

2008年12月23日 · Toshimitsu Takahashi

.NET / WebBrowser コントロールで Java アプレットを起動するとデータ実行防止(DEP)で落ちるとき

Windows Vista や Windows XP SP2 で DEP がオンになっているとき、Javaアプレットをカスタム WebBrowser で実行すると AccessViolationException で落ちてしまう。実行時にはデータ実行防止(DEP)が働いたといわれる。 そんなときは、Visual Studio 2008 でプロジェクトのプロパティ⇒「ビルド イベント」⇒「ビルド後に実行するコマンド ライン」に call “C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat” editbin.exe /NXCOMPAT:NO “$(TargetPath)” を定義しておくと、「データ実行防止との互換性」が無いことになり、DEP が発生しなくなる。(ちなみに Release でビルドして、そのまま Visual Studio から実行すると vhost.exe の方で落ちてしまう。) 参照) http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3818241&SiteID=1 http://msdn.microsoft.com/ja-jp/library/ms235442.aspx

2008年12月9日 · Toshimitsu Takahashi

ウイルスバスター2008がAutoComplete機能を不審な変更とみなす

前々から気づいていたのだが書いておく。 .NET Framework 2.0 から TextBox などにファイルや URL の自動補完機能が付けられるようになった。 テキストボックスでオートコンプリート機能を使用するには?[2.0のみ、C#、VB] − @IT これを有効にしている(実際にはSHAutoComplete を使っている場合)とウイルスバスター 2008 が「不審な変更を拒否しました」と重要度「高」で怒ってくる。 こういう一般ユーザーに、何だが嫌な思いをさせてしまうのをどうにかできないものだろうか。アプリケーションを高機能したことによる、トレードオフといってしまえばそれだけかもしれない。そういう事例があると予め提示しておくしかないだろうか。

2008年11月25日 · Toshimitsu Takahashi

C# でバイト配列と16進数文字列を相互変換するには

.NET にバイト配列を16進数文字列にエンコード/デコードする方法が用意されていなかったので、自作した。(Base64 なら Convert にある。) 文字列への変換は、BitConverter.ToString に Replace("-", String.Empty) とすることでもできなくはなさそうだが、効率が良さそうには思えないので止めた。 Convert.ToString(b, 16) で b が16進数で1桁のときの0補完でハマった。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 /// <summary> /// バイト配列と文字列との変換機能を提供する /// </summary> public class BytesConvert { /// <summary> /// バイト配列から16進数の文字列を生成します。 /// </summary> /// <param name="bytes">バイト配列</param> /// <returns>16進数文字列</returns> public static string ToHexString(byte\[\] bytes) { StringBuilder sb = new StringBuilder(bytes.Length * 2); foreach (byte b in bytes) { if (b < 16) sb.Append('0'); // 二桁になるよう0を追加 sb.Append(Convert.ToString(b, 16)); } return sb.ToString(); } /// <summary> /// 16進数の文字列からバイト配列を生成します。 /// </summary> /// <param name="str">16進数文字列</param> /// <returns>バイト配列</returns> public static byte\[\] FromHexString(string str) { int length = str.Length / 2; byte\[\] bytes = new byte\[length\]; int j = 0; for (int i = 0; i < length; i++) { bytes\[i\] = Convert.ToByte(str.Substring(j, 2), 16); j += 2; } return bytes; } }

2007年9月23日 · Toshimitsu Takahashi

VS.NET のセットアップ プロジェクトでショートカット作成をユーザーに選択させるには

スタートアップに登録するかどうかなどをインストール時に選択できるようにしたい。ユーザーインターフェイスエディタでチェックボックス ダイアログを追加すれば簡単にできそうだった。しかし、ショートカットには condition プロパティがないので条件を付加できない。そこでビルドした MSI ファイルをエディトして条件を追加する。 Windows SDK(以前の Platform SDK)をインストールすると、C:\Program Files\Microsoft SDKs\Windows\v6.0\Bin に Orca.msi というセットアップファイルがある。これを使って Orca というアプリケーションをインストールします。イルカのアイコンのこのアプリを起動して、VS.NET で生成した msi ファイルを読み込みます。*1 左側の Tables ペインから Shortcut を選択し、条件を付けたい項目の Component_ を確認(コピー)しておく。 Tables ペインから Component を選択し、Component 列から確認した項目を探す。 該当項目の Condition にチェックボックス ダイアログで設定した [CheckBoxProperty1の値]=1 と書き込む。 標準のままであれば CHECKBOXA1=1 となる。 上書き保存する。 これで完了。(VS.NET 側でプロパティを公開してくれれはいいだけなんですけどね…) 上記の方法は間違ってました。また毎回ビルド後に直さないといけないので、カスタム動作にしてしまった方が楽かもしれません。 と思いましたが Vista だと色々ありそうです。InstallerClass を作ってしまうのが一番いいかもしれません。ただこれだとまた DLL ファイルが増えます。 参考) *1:[http://support.microsoft.com/kb/255905/ja:title]

2007年9月8日 · Toshimitsu Takahashi

C# から iTunes COM Windows SDK を試す

参照設定で COM - iTunes Type Library を追加する。フォームにラベルを貼って、現在 iTunes で再生中のトラックの アーティスト名 - 曲名 (アルバム名) を表示するサンプル。 COM のため Marshal.ReleaseComObject で参照解除をしてあげないと、iTunes を終了するときに握っている旨のメッセージが表示されてしまう。次にサンプルは終了時に連動して終了するようにしている。 ラベルの書き換えは、別スレッドからの操作だから Invoke してやること。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using iTunesLib; namespace WindowsApplication1 { public partial class Form1 : Form { private iTunesApp itunes; public Form1() { InitializeComponent(); init(); } private void init() { itunes = new iTunesApp(); itunes.OnAboutToPromptUserToQuitEvent += new _IiTunesEvents_OnAboutToPromptUserToQuitEventEventHandler(itunes_OnAboutToPromptUserToQuitEvent); itunes.OnPlayerPlayEvent += new _IiTunesEvents_OnPlayerPlayEventEventHandler(itunes_OnPlayerPlayEvent); } private void unhock() { itunes.OnPlayerPlayEvent -= new _IiTunesEvents_OnPlayerPlayEventEventHandler(itunes_OnPlayerPlayEvent); itunes.OnAboutToPromptUserToQuitEvent -= new _IiTunesEvents_OnAboutToPromptUserToQuitEventEventHandler(itunes_OnAboutToPromptUserToQuitEvent); Marshal.ReleaseComObject(itunes); itunes = null; } void itunes_OnPlayerPlayEvent(object iTrack) { IITTrack track = itunes.CurrentTrack; if (track != null) { label1.Text = track.Artist + " - " + track.Name + " (" + track.Album + “)”; Marshal.ReleaseComObject(track); } } void itunes_OnAboutToPromptUserToQuitEvent() { unhock(); this.Invoke((System.Windows.Forms.MethodInvoker)delegate() { this.Close(); }); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (itunes != null) unhock(); } } }

2007年6月11日 · Toshimitsu Takahashi

.NET Internet Explorer のバージョンを取得する

他にも方法はあるだろうがレジストリから取得するのが一番良さそう。 文字列でIEのバージョンを返す。エントリがなく取得に失敗したら null を返す。 1 2 3 4 5 6 7 8 9 10 11 12 13 public static string getInternetExplorerVersion() { string rKeyName = @"SOFTWARE\\Microsoft\\Internet Explorer"; string rValueName = "Version"; try { Microsoft.Win32.RegistryKey rKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(rKeyName); string sVersion = (string)rKey.GetValue(rValueName); rKey.Close(); return sVersion; } catch (NullReferenceException) { return null; } }

2007年5月5日 · Toshimitsu Takahashi