ラベル C# / .NET Framework の投稿を表示しています。 すべての投稿を表示
ラベル C# / .NET Framework の投稿を表示しています。 すべての投稿を表示

2011年11月6日日曜日

WPF Toolkit - Chart コントロール

もっとも基本的と思われる折れ線グラフの表示を,コードから行う方法です.

using System.Windows.Controls.DataVisualization.Charting;
using System.Windows.Media;
using System.Windows;

var chart = new Chart();

var points = new PointCollection();
points.Add(new Point(1, 2));
points.Add(new Point(2, 4));
points.Add(new Point(3, 3));

var xAxis = new LinearAxis() { Maximum = 10, Minimum = 0, Orientation = AxisOrientation.X };
var yAxis = new LinearAxis() { Maximum = 10, Minimum = 0, Orientation = AxisOrientation.Y };
chart.Axes.Add(xAxis);
chart.Axes.Add(yAxis);

var series = new LineSeries() { DependentValuePath = "Y", IndependentValuePath = "X", ItemsSource = points };
chart.Series.Add(series);

あとはchartのインスタンスをコントロールとして追加すれば,表示されるはずです.

参考:LineSeries chart : "No suitable axis is available for plotting the dependent value"の回答に依れば, Consuming Binary Encoded WCF 4.0 Service in Silverlight 3.0 Applications Silverlight 2 Toolkit Overviewが役立つそうです.

2011年9月8日木曜日

XML Schemaを使って,XMLをパースする

この記事ではGPX (GPS eXchange Format)ファイルを読み込む方法を記述します.

まずは,XML Schema GPX 1.1 Schema (gpx.xsd)を貰ってきます.

XML スキーマ定義 ツールを用いてXML Schemaからコードを生成します.

xsd gpx.xsd /classes /language:cs /namespace:Gpx

生成されたコード gpx.cs を任意のプロジェクトに組み込みます.以下のようにしてgpxファイルを読み込むことができます.

Gpx.gpxType gpx;
using (var file = new System.IO.FileStream("...\\test.gpx", System.IO.FileMode.Open))
{
    var xmls = new System.Xml.Serialization.XmlSerializer(typeof(Gpx.gpxType));
    gpx = (Gpx.gpxType)xmls.Deserialize(file);
    file.Close();
}

参考:The GPX Exchange FormatRecordings and Documents

2011年7月13日水曜日

dynamicとCOMとメモリ リーク

C#から(「CLR上から」と言った方が良いかもしれないが)COMインタフェースを用いる場合には細心の注意を払う必要がある.

今回発生した問題は,Microsoft Internet Controls(SHDocVw名前空間)およびMicrosoft HTML Object Library(mshtml名前空間)を用いてInternet Explorerと相互作用するソフトウェアを開発している際に発生したメモリ リークである.

リークの直接的原因は,dynamicを用いてCOMインタフェースを管理したことにあったようだ.

メモリリークを起こすコード

SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer();
dynamic doc = ie.Document;
Marshal.ReleaseComObject(doc);
Marshal.ReleaseComObject(ie);

メモリリークを起こさない(と思われる)コード

SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer();
mshtml.IHTMLDocument2 doc = ie.Document;
Marshal.ReleaseComObject(doc);
Marshal.ReleaseComObject(ie);

COMインタフェースのプロパティやメソッドの戻り値がdynamicだからと言って,dynamic(あるいはvar)を用いないように注意する必要がありそうだ.

参考:dynamic(C# によるプログラミング入門)ReleaseComObject(cbrumme's WebLog)

2011年2月6日日曜日

Internet Explorerの自動操作

C#を使ってInternet Explorerを自動操作します.

※もちろん.NET Frameworkの使える言語ならC#以外でも同じことが行えるはずです.

まず,次の2つのファイルへの参照を追加します.どちらもC:\Windows\System32にあると思います.

  • mshtml.tlb
  • shdocvw.dll

IEの自動化に使うクラスは,InternetExplorer ObjectInterfaces and Scripting ObjectsのリストにあるIHTML*というクラス達になります.

データ型のよくわからないオブジェクトを沢山扱うことになりますので,dynamicキーワードを使うと便利です.こちらの記事を必ず確認して下さい.

後は,簡単な使い方をメモしておきます.

  • インターネット・エクスプローラを起動・終了を行う.
    SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer();
    ie.Visible = true;
    ie.Quit();
  • ページの移動を行う.
    ie.Navigate("http://www.bing.com/");
    ページ移動の完了を知るにはie.NavigateComplete2イベントをキャッチ.
  • リンクを探して押したい.
    foreach (dynamic link in ie.Document.links)
    {
        if (link.href == "http://jp.msn.com/")
        {
            link.click();
            // ie.Navigate(link.href); という方法もある
             break;
        }
    }
  • フォームを自動入力したい.
    foreach (dynamic form in ie.Document.forms)
    {
        if (form.action == "/search")
        {
            foreach (dynamic element in form.Descendants)
            //Descendantsはchildrenプロパティを使って自分で実装します
             {
                switch ((string)element.getAttribute("name"))
                {
                    case "q":
                        element.setAttribute("value", "テスト");
                        break;
                    case "go":
                        element.click();
                        return;
                }
            }
        }
    }

2010年11月3日水曜日

日本語でプログラミング

C#のプログラムを,Visual Studio 2010で書いていたのですが,なんと日本語の変数名,関数名が使えるんですね!Unicodeの夜明けってことでしょうか.

固有名詞とかを無理やり英語に訳さなくてよくなりました.もっと早く知ってればよかったのに~><

2010年5月17日月曜日

Magic Packetをブロードキャスト・送信するコマンドラインツール

マジックパケットをブロードキャストまたは送信するコマンドラインツールです.

システム要件

以下でダウンロードできる実行可能ファイルの動作には.NET Framework 4.0が必要です.(ソースは3.5とかと共通だと思います)

免責・使用条件

以下に公開されているソースコードおよび実行可能ファイルは,以下の条件に同意した場合に限り,著作権者の特別な許可なく自由に使用できます.

  • NKY-TECH.は,このツールの使用に起因する如何なる損害に対する責任も負わないものとします.
  • このツールを公序良俗に反する行為,また違法行為に使用することはできません.

ダウンロード

ソースファイル一式(Visual Studio 2010プロジェクト一式)と実行可能ファイルです.

2010年2月25日木曜日

.NET Framework 4.0で混合モードのアセンブリを読み込めない旨のエラー

※記事を書いている時点では,.NET Framework 4.0はリリース候補版です.また,開発環境はVisual Studio 2010のリリース候補版です.

Mixed mode assembly is built against version 'v1.x(or v2.x)' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information.

エラーを解決するには,アプリケーションの設定ファイル(app.config)を以下のように書き換えます.

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

混合モードアセンブリ(managedとunmanagedのコードを両方含んだアセンブリ)は何かと使うので,少なくともしばらくはこの設定は外せそうになさそうです.それは兎も角として,CLR 3.0はどこへ!?

参考:<startup> ElementF# Scripting, .NET 4.0 and Mixed-mode assemblies

2009年7月30日木曜日

タスクバーを除いたデスクトップの位置

デスクトップにおける,タスクバーを除いた領域の位置を取得するには,以下のようにする.

RECT rct;
SystemParametersInfo( SPI_GETWORKAREA , 0 , &rct , 0 );

関数が成功すれば,rctにタスクバーを除いたデスクトップの位置が格納されている.

.NETでは,System.Windows.Forms.SystemInformation.WorkingAreaを使えばよい.