お髭処blog

ドイツのものを中心としたボードゲーム・カードゲームのプレイ記録・感想を中心としたブログです。最新のドイツゲームから、紀元前から伝わるゲーム、旧西ドイツ製のレアゲーム、日本伝統の博打まで幅広くプレイしています。

C# で Windows RSS Platform プログラミングに挑戦

近頃、Visual Studio 2008 も発売されたし、新しい技術にも挑戦してみたかったので、C#でプログラムを書いてみた。テーマは、最近自動配布が開始された Internet Explorer 7 (IE7)を利用したもの。IE7 には、RSSリーダーの機能がありますが、どのRSSを購読しているかの情報や、既読・未読の情報は IE7 が独自に持っているのではなく、OS が複数のアプリケーションから扱う事ができる共通の基盤として持っているのですね。IE7 をインストールすると、OS にそのような機能が追加されるわけです。
これはなかなかすぐれた仕組みだと思うんですね。複数のRSSリーダー機能を持ったアプリケーションや Widgetウィジェットをインストールしたときに、それぞれが個別に購読情報を持たずに済みますから。もっとも、インターネット上のサーバーに情報を置いた方が、複数のコンピュータで情報を共有できて、もっと便利かとは思いますが。
その技術の名称は、 Windows RSS PlatformWindows 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 で言うところの、「参照」の設定に当る部分をオプションで指定する必要があると思うのですが、どうしたらいいのかわかりません。行き詰まりました。