近頃、Visual Studio 2008 も発売されたし、新しい技術にも挑戦してみたかったので、C#でプログラムを書いてみた。テーマは、最近自動配布が開始された Internet Explorer 7 (IE7)を利用したもの。IE7 には、RSSリーダーの機能がありますが、どのRSSを購読しているかの情報や、既読・未読の情報は IE7 が独自に持っているのではなく、OS が複数のアプリケーションから扱う事ができる共通の基盤として持っているのですね。IE7 をインストールすると、OS にそのような機能が追加されるわけです。
これはなかなかすぐれた仕組みだと思うんですね。複数のRSSリーダー機能を持ったアプリケーションや
その技術の名称は、
C# には初挑戦。それどころか、オブジェクト指向言語でまともにプログラムを書いたことがありません。こんな感じでいいのでしょうか。教えてください、詳しい人。
どんなプログラムか説明します。コマンドプロンプトから使用するプログラムです。IE7で登録したフィードのフォルダ名と、そのフォルダ内の未読フィード件数を表示します。
IE を開いているよりもコマンドプロンプトを開いている方が色々都合がいい人向けです。コマンドプロンプトにあまりたくさんの情報を表示しても不便かと思い、全てのフィードは表示せず、フォルダ単位で未読件数を表示するようにしました。
// CheckFeeds.cs // // http://msdn2.microsoft.com/en-us/library/ms684736.aspx を参考に作成 using System; using System.Collections.Generic; using Microsoft.Feeds.Interop; public class CheckFeeds { public static int Main (string[] args) { try { if (args.Length != 0) { DisplayHelp(); return -1; } CheckRss rss = new CheckRss(); rss.Check(); List<News> rssData = rss.getNewsData(); foreach (News n in rssData) { Console.WriteLine("{0}\t({1})", n.Name, n.Num); } return 0; } catch { Console.Error.WriteLine("CheckFeeds.exe: Error."); return -1; } } private void DisplayHelp() { Console.Error.WriteLine("Usage: checkfeeds"); } } public class News { private string m_name; private int m_num; private string m_time; public News(string name, int num, string time) { m_name = name; m_num = num; m_time = time; } public string Name { get { return m_name; } } public int Num { get { return m_num; } } public string Time { get { return m_time; } } } public class CheckRss { private List<News> rssList; public CheckRss() { rssList = new List<News>(); } public void Check () { AggregateFeedCount(); } private int AggregateFeedCount() { IFeedsManager feedmgr = new FeedsManagerClass(); return AggregateFeedCount((IFeedFolder)feedmgr.RootFolder); } private int AggregateFeedCount(IFeedFolder folder) { i = folder.TotalUnreadItemCount; if ( i > 0) { //Console.WriteLine("{0}\t({1})", folder.Name, i); rssList.Add(new News(folder.Name, i, "")); } foreach (IFeedFolder subfolder in (IFeedsEnum)folder.Subfolders) { AggregateFeedCount(subfolder); } return i; } public List<News> getNewsData() { return rssList; //ローカルオブジェクトへの参照を返して大丈夫か? } }
これを、.Net Framework 2.0 付属のC#コンパイラ(csc.exe)でコンパイルしようとしたのですが、エラーになってしまいました。(.Net Framework 2.0 は Window Update および Microsoft Update でダウンロードできます)
c:\windows\Microsoft.NET\Framework\v2.0.50727\csc /r:msfeeds.dll /o CheckFeeds.cs
Microsoft(R) Visual C# 2005 Compiler version 8.00.50727.42 for Microsoft(R) Windows(R) 2005 Framework version 2.0.50727 Copyright (C) Microsoft Corporation 2001-2005. All rights reserved. error CS0006: 'msfeeds.dll' メタデータが見つかりませんでした。
うーん、/r オプションの指定がまずいのかな。"/r:c:\windows\system32\msfeeds.dll" としてみましたが、次のようなエラーとなってしまいました。
Microsoft(R) Visual C# 2005 Compiler version 8.00.50727.42 for Microsoft(R) Windows(R) 2005 Framework version 2.0.50727 Copyright (C) Microsoft Corporation 2001-2005. All rights reserved. fatal error CS0009: 'c:\WINDOWS\system32\msfeeds.dll' メタデータ ファイルを開けませんでした -- '間違ったフォーマットのプログラムを読み込もうとしました。 '
たぶん、Visual Studio で言うところの、「参照」の設定に当る部分をオプションで指定する必要があると思うのですが、どうしたらいいのかわかりません。行き詰まりました。