PS VitaのSDK

先週、 PS Vita を購入して暇つぶしにゲームをしてますが、あまりに没頭しすぎて暇つぶしどころじゃなくなってしまう(^^

ところで、とある雑誌の開発者インタビュー記事を見てみると、Vitaを含む開発環境 「PS Suite SDK 」は、サンデープログラマーを代表とする一般個人の開発者も自由に使えるようにしたい・・・とのこと。

さらにVitaとAndroidのクロスプラットフォーム、ということなんで1粒で2度美味しいSDKらしい。

採用されている記述言語は、C# なので、かなり楽しみ。ゲームなんて無理だけど最新のデバイスで、遊ぶだけじゃなくて弄れる(プログラミングできる)というのは非常にありがたい気がします。.NET Framework互換のMono VM上で・・・ということは、C#で組んでるコードはほとんどそのままで動く。

Android だとSDKがJavaだったので・・・Javaだとなんか食指が動かないというか、Javaには嫌なイメージがあるのと、まだ実機が一個もないので敬遠してたけど・・・PS Vita だと C# だし・・・気軽に試せそうな気がします。

ただ、ちょっと気がかりなことは・・・
記事内では、「自由につかえるように・・・」ということなんですが、有償かフリーなのか、という記述がなかったので、その点が問題かな・・・?まだ非公開ベータテストで来春オープンなベータテストを・・・、ということなので、まだどのような形で一般向けに公開されるのか、ということが決まってないのかもしれませんね。

楽しみです。

PS Vita のアカンところ(^^;;;

携帯ゲーム機を初めて買いました。ゲームをすることは殆どないのですが、なんとなくハードウェアのスペックに惹かれて買っただけ(^^;;; 暇つぶしにと思って一緒に2~3個のゲームも買ったので、それなりに出費が痛かった(__;)

最初、起動して初期設定時、省電力機能でスリープしてしまってPSボタンを押しても電源ボタンを押してもスリープから復帰せず、フリーズしたみたいな状態で焦りました( ̄。 ̄;) 初期不良か???と思ったんですが、Twitterで検索してみたら同じ状況に陥っている人のツイートが多く、いきなり不具合かよーーー!という罠に。。。
こういう場合は電源ボタン長押しでリセット、というのが最近のデバイスの共通UI、ということで30秒ほど押しっぱなししてみると・・・予想どおり再起動してくれました。焦った(^^;;;

一通り初期設定を済ませると、あとは問題無く動作したけど、スリープからの復帰が若干遅い?感じです。

有機ELディスプレイは、キレイっすね~。視野角も広くほぼ真下・真横から見てもほとんど違和感なし。液晶とは違ったコントラストの高い発色。

ゲームも、非常に画面がクリアでエエ感じです。

で、あかんところ。

  • PCからVitaへのの画像の転送、Vita内での削除処理が遅すぎる!
  • 上にも書いたけど、スリープからの復帰がなんか遅い。
  • 標準では基本タッチ操作しか受け付けない。ジョイスティックや各種ボタンが一切活用されてない。
  • 搭載ブラウザは、Webkitベースらしいけど、動作重すぎ。しかも画面タッチでのみの操作。背面タッチでスクロールとか、スティックでスクロールとか・・・なんでやんないんだろう?
  • まだDLNA非対応、スカイプもできない。
  • WiFi接続がすぐ切れてしまう。
  • 搭載カメラの解像度が低すぎて話にならない。
  • 内蔵スピーカーの位置がなんでソコ?みたいな。。。手で隠れてしまってしまう。
  • システムソフトウェア、主にUIの部分で、作り込みが未完成。

基本、ゲーム機なんで、とりあえずゲームさえできればいい、みたいな感じの作り込み。

・・・というか、よくこんな状態で発売したな・・・という印象。ハードウェアはともかく、ソフトウェアがもう惨憺たるありさま。
これってPlaystation3のときもそうだったけど、またその繰り返しみたいな感じです。

未完成品を発売して、あとからソフトウェアのアップデートでなんとかしよう、という気質はSCEの伝統なんですかね。。。
とりあえず、半年ぐらいでまともに使えるように、システムソフトウェアのアップデートを期待したい。

難読化なのか単なる嫌がらせなのか?

(2011/12/29 ちょこっと追記した)

javascriptの難読化についてググってたら、たまたま検索結果にAcme::EyeDropsというPerlモジュールを見かけました。

cpan Acme::EyeDrops か、ActivePerlなら ppm install Acme-EyeDrops とかでインストール。

結構はまってしまいまして・・・eyeファイル作るの楽しいす。自己満ですけど(^^;
eyeファイルは、要は「#」だけでアスキーアートを作ればいいだけ。エディターだけで作るのは手間かかるけど、テキストペイントっていうアプリが一番使いやすい。かなり古いけど。この手のアプリって、なんか有名なものってあるんですかね?

たとえば・・・下記のようなeyeファイル(拡張子はeye)と、

##    ##  #######  ##     ## ########     ######## ##    ## ########  ######    #######  ##    ## ##       ##    ##
 ##  ##  ##     ## ##     ## ##     ##    ##        ##  ##  ##       ##    ##  ##     ## ###   ## ##        ##  ##
  ####   ##     ## ##     ## ##     ##    ##         ####   ##       ##        ##     ## ####  ## ##         ####
   ##    ##     ## ##     ## ########     ######      ##    ######    ######   ##     ## ## ## ## ##          ##
   ##    ##     ## ##     ## ##   ##      ##          ##    ##             ##  ##     ## ##  #### ##          ##
   ##    ##     ## ##     ## ##    ##     ##          ##    ##       ##    ##  ##     ## ##   ### ##          ##
   ##     #######   #######  ##     ##    ########    ##    ########  ######    #######  ##    ## ########    ##
 

下記のように変換するサンプルスクリプトを用意して・・・

#!/usr/bin/perl
#
#  hello world
#
use strict;
use warnings;
use IO::File;

&{sub
{
  IO::File->new_from_fd(fileno(STDERR),'>')->print('Hello,World\n');
  
}}(@ARGV);

下記変換スクリプトで上記ファイルを処理してやると・・・

#!/usr/bin/perl

use strict;
use warnings;

use Acme::EyeDrops qw/sightly/;

#Startup code
&{sub{

  my $command =
    {
      Regex => 0, 
      EyeDir => eyeファイルが置かれているディレクトリパス
      Shape =>; 変換に使用するeyeファイルのベース名
      SourceFile => 変換するPerlファイル
    };

  print sightly($command);

}}(@ARGV);

↓のような感じに変換される。。。これでちゃーーーーんとPerlスクリプトとして動くんだ!
用途は分からんけど・・・(笑) もう嫌がらせの域かと。 実際、忙しい時に、こんなファイルを見せられたら発狂するな(^^;;;
ドキュメントをよく読んでないので分かりませんが、変換後のソースを元に戻す方法あるのかな~?

遠くから見ると、文字に見えてきませんか?(^^;;;

eval eval '"'.


((    ((  '#'))))  .+     (( ('!'))).     '/'.('[' ^+    (( '.'))).(  ('[')^    "(").(  ((    (( ((       ((    ((
 ((  ((  ((     (( ((     (( ((     ((    ((        ((  ((  ((       ((    ((  ((     (( '['   )) ))        ))  ))
  ))))   ))     )) ))     )) ))     ))    ))         ))))   ))       ))        ))     )) ))))  ^+ ((         ')')
   ))    .+     (( ((     (( '/')))))     ).('`'      |+    '"').(    ('`')|   ((     (( (( (( (( ((          ((
   ((    ((     (( ((     (( ((   ((      ((          ((    ((             ((  ((     (( ((  ')') ))          ))
   ))    ))     )) ))     )) ))    ))     ))          ))    ))       ))    ))  ))     )) ))   ))) ))          ))
   ).     (('`')|   ('.')).  ((     ((    '/')))).    +(    '['^'+')  .('`'|    "%").(  ((    (( '['))))^    ((
 
 
((    ((  ')'))))  ))     ). ('`'|','     ).("!"^ ((    (( '+')))))  .('['^    ".").(  ((    (( ((       ((    ((
 ((  ((  ((     (( ((     (( ((     ((    ((        ((  ((  ((       ((    ((  ((     (( '['   )) ))        ))  ))
  ))))   ))     )) ))     )) ))     ))    ))         ))))   ))       ))        ))     )) ))))  ^+ ((         '(')
   ))    .(     (( ((     (( '`')))))     )|'%')      .(    ('{')^    '[').(   ((     (( (( (( (( ((          ((
   ((    ((     (( ((     (( ((   ((      ((          ((    ((             ((  ((     (( ((  '[') ))          ))
   ))    ))     )) ))     )) ))    ))     ))          ))    ))       ))    ))  ))     )) ))   ))) ))          ))
   ^+     "(").(   '['^'/'  ).     +(    '['^')')    .(    '`'|')')  .('`'|    "#").(  ((    (( '['))))^    ((
 
 
((    ((  '/'))))  ))     ). ';'.('!'     ^"+").( ((    (( '['))))^  '.').(    '['^'('  ).    +( ((       ((    ((
 ((  ((  ((     (( ((     (( ((     ((    ((        ((  ((  ((       ((    ((  ((     (( '`'   )) ))        ))  ))
  ))))   ))     )) ))     )) ))     ))    ))         ))))   ))       ))        ))     )) |'%'  ). +(         '{'^
   ((    ((     (( ((     (( '[')))))     ))))))      .(    ('[')^    ',').(   ((     (( (( (( (( ((          ((
   ((    ((     (( ((     (( ((   ((      ((          ((    ((             ((  ((     (( ((  '`') ))          ))
   ))    ))     )) ))     )) ))    ))     ))          ))    ))       ))    ))  ))     )) ))   ))) ))          ))
   |+     "!").(   '['^')'  ).     +(    '`'|'.')    .(    '`'|')')  .('`'|    ".").(  ((    (( '`'))))|    ((
 
 
((    ((  "'"))))  ))     ). ('['^'('     ).";".( ((    (( '!'))))^  '+').(    '['^'.'  ).    +( ((       ((    ((
 ((  ((  ((     (( ((     (( ((     ((    ((        ((  ((  ((       ((    ((  ((     (( '['   )) ))        ))  ))
  ))))   ))     )) ))     )) ))     ))    ))         ))))   ))       ))        ))     )) ^'('  ). +(         '`'|
   ((    ((     (( ((     (( '%')))))     ))))))      .(    ('{')^    '[').(   ((     (( (( (( (( ((          ((
   ((    ((     (( ((     (( ((   ((      ((          ((    ((             ((  ((     (( ((  '`') ))          ))
   ))    ))     )) ))     )) ))    ))     ))          ))    ))       ))    ))  ))     )) ))   ))) ))          ))
   ^+     ")").(   '`'^'/'  ).     ((    (':'))).    ((    ":")).(  ('`')^    "&").(  ((    (( '`'))))|    ((
 
 
((    ((  ')'))))  ))     ). ('`'|','     ).("`"| ((    (( '%')))))  .';'.(    '!'^'+'  ).    +( ((       ((    ((
 ((  ((  ((     (( ((     (( ((     ((    ((        ((  ((  ((       ((    ((  ((     (( '!'   )) ))        ))  ))
  ))))   ))     )) ))     )) ))     ))    ))         ))))   ))       ))        ))     )) ^'+'  ). ((         '&')
   ).    ((     (( ((     (( '\'))))     )))).+      ((    '{')).    ("["^   ((     (( (( (( (( ((          ((
   ((    ((     (( ((     (( ((   ((      ((          ((    ((             ((  ((     (( ((  '(') ))          ))
   ))    ))     )) ))     )) ))    ))     ))          ))    ))       ))    ))  ))     )) ))   ))) ))          ))
   ).     (('[')^   ".").(  ((     ((    '`'))))|    ((    '"'))).(  ('!')^    ('+')).  ((    (( '\'))))    .+
 
 
((    ((  '{'))))  .(     (( ('!')))^     ('+')).( ((    (( '{'))))^  '[').(    '{'^'['  ).    +( ((       ((    ((
 ((  ((  ((     (( ((     (( ((     ((    ((        ((  ((  ((       ((    ((  ((     (( '`'   )) ))        ))  ))
  ))))   ))     )) ))     )) ))     ))    ))         ))))   ))       ))        ))     )) ^')'  ). +(         '`'^
   ((    ((     (( ((     (( '/')))))     ))))))      .+    (':').    ":".(   ((     (( (( (( (( ((          ((
   ((    ((     (( ((     (( ((   ((      ((          ((    ((             ((  ((     (( ((  '`') ))          ))
   ))    ))     )) ))     )) ))    ))     ))          ))    ))       ))    ))  ))     )) ))   ))) ))          ))
   ^+     "&").(   '`'|')'  ).     +(    '`'|',')    .(    '`'|'%')  ."-".    ('>').(  ((    (( '`'))))|    ((
 
 
((    ((  '.'))))  ))     ). ('`'|'%'     ).("["^ ((    (( ',')))))  .'_'.(    '`'|'&'  ).    +( ((       ((    ((
 ((  ((  ((     (( ((     (( ((     ((    ((        ((  ((  ((       ((    ((  ((     (( '['   )) ))        ))  ))
  ))))   ))     )) ))     )) ))     ))    ))         ))))   ))       ))        ))     )) ^')'  ). +(         '`'|
   ((    ((     (( ((     (( '/')))))     ))))))      .(    ('`')|    "-").   ((     (( (( (( (( ((          ((
   ((    ((     (( ((     (( ((   ((      ((          ((    ((             ((  ((     (( ((  '_') ))          ))
   ))    ))     )) ))     )) ))    ))     ))          ))    ))       ))    ))  ))     )) ))   ))) ))          ))
   .(     '`'|'&'   ).('`'|  ((     ((    '$')))))    .+    '('.('`'  |'&').    (('`')|  ((    (( ')')))))    .(
 
 
((    ((  '`'))))  |+     (( ','))).(     '`'|'%') .(    (( ('`')))|  '.').(    '`'|'/'  ).    (( ((       ((    ((
 ((  ((  ((     (( ((     (( ((     ((    ((        ((  ((  ((       ((    ((  ((     (( '('   )) ))        ))  ))
  ))))   ))     )) ))     )) ))     ))    ))         ))))   ))       ))        ))     )) )).(  (( ((         '{')
   ))    )^     (( ((     (( '(')))))     )).''.      +(    ('{')^    '/').(   ((     (( (( (( (( ((          ((
   ((    ((     (( ((     (( ((   ((      ((          ((    ((             ((  ((     (( ((  '`') ))          ))
   ))    ))     )) ))     )) ))    ))     ))          ))    ))       ))    ))  ))     )) ))   ))) ))          ))
   ^+     "$").(   '`'^'%'  ).     +(    '{'^')')    .(    '{'^')')  .")".    ','."'"  .+    (( ('>'))).    ((
 
 
((    ((  "'"))))  ))     .+ ')'.'-'.     '>'.('[' ^+    (( '+'))).(  ('[')^    ")").(  ((    (( ((       ((    ((
 ((  ((  ((     (( ((     (( ((     ((    ((        ((  ((  ((       ((    ((  ((     (( '`'   )) ))        ))  ))
  ))))   ))     )) ))     )) ))     ))    ))         ))))   ))       ))        ))     )) ))))  |+ ((         ')')
   ))    .(     (( ((     (( '`')))))     )|'.')      .(    ('[')^    "/").   ((     (( (( (( (( ((          ((
   ((    ((     (( ((     (( ((   ((      ((          ((    ((             ((  ((     (( ((  '(') ))          ))
   ))    ))     )) ))     )) ))    ))     ))          ))    ))       ))    ))  ))     )) ))   ))) ))          ))
   .+     ('\').   ('"').(  ((     ((    '`'))))^    ((    '('))).(  ('`')|    "%").(  ((    (( '`'))))|    ((
 
 
((    ((  ','))))  ))     ). ('`'|','     ).("`"| ((    (( '/')))))  .','.(    '{'^','  ).    +( ((       ((    ((
 ((  ((  ((     (( ((     (( ((     ((    ((        ((  ((  ((       ((    ((  ((     (( '`'   )) ))        ))  ))
  ))))   ))     )) ))     )) ))     ))    ))         ))))   ))       ))        ))     )) |'/'  ). +(         '['^
   ((    ((     (( ((     (( ')')))))     ))))))      .(    ('`')|    ',').(   ((     (( (( (( (( ((          ((
   ((    ((     (( ((     (( ((   ((      ((          ((    ((             ((  ((     (( ((  '`') ))          ))
   ))    ))     )) ))     )) ))    ))     ))          ))    ))       ))    ))  ))     )) ))   ))) ))          ))
   |+     ('$')).   ('\').  ((     ((    '\'))))    .(    '`'|'.')  .'\'.    '"'.')'  .+    (( ";")).(    ((
 
 
((    ((  '!'))))  ))     ^+ ('+')).(     '{'^'[') .(    (( ('{')))^  '[').(    '!'^'+'  ).    (( ((       ((    ((
 ((  ((  ((     (( ((     (( ((     ((    ((        ((  ((  ((       ((    ((  ((     (( (((   (( ((        ((  ((
  '\'   ))     )) ))     )) ))     ))    ))         ))))   ))       ))        ))     )) ))))  )) ))         ))))
   ))    ))     )) ))     )) ))).'}'.     '\'.+      ((    '}')).    ('(').   ((     (( (( (( (( ((          ((
   ((    ((     (( ((     (( ((   ((      ((          ((    ((             ((  ((     (( ((  '\' ))          ))
   ))    ))     )) ))     )) ))    ))     ))          ))    ))       ))    ))  ))     )) ))   ))) ))          ))
   ).     ('@').(   '`'^'!'  ).     +(    '{'^')')    .(    '`'^"'")  .('{'^    ('-')).  ((    (( ')')))).    ((
 
 
((    ((  ';'))))  ))     .( '!'^'+')     .(('!')^ ((    (( '+')))))  .""";    $:='.'^  ((    (( ((       ((    ((
 ((  ((  ((     (( ((     (( ((     ((    ((        ((  ((  ((       ((    ((  ((     (( '~'   )) ))        ))  ))
  ))))   ))     )) ))     )) ))     ))    ))         ))))   ))       ))        ))     )) ))))  ;( $~         )=((
   ((    ((     (( ((     (( '@')))))     ))))))      )|    '(';$^    =")"^   ((     (( (( (( (( ((          ((
   ((    ((     (( ((     (( ((   ((      ((          ((    ((             ((  ((     (( ((  '[') ))          ))
   ))    ))     )) ))     )) ))    ))     ))          ))    ))       ))    ))  ))     )) ))   ))) ))          ))
   ;(     $/)='`'   |'.';$,  =(     ((    "(")))^    ((    '}'));$  ="`"|    '!';#;#  ;#    ;# ;#;#;#;#    ;#
 
 

cygwin with mintty

いまさらながら、(個人的に)必要に迫られてcygwinを夏に買ったVAIO Zにインストールした。

もともと vpsのssh接続用にTera Term Proをインストールしていたので、Tera Term Proに入っているCygtermを介して Tera Term Pro 上で使うようにしました。コピペもWindowsのコマンドプロンプトなシェル より遥かに使い勝手がいいし。

で、ちょっと調べてみたら、cygwin の端末エミュレータとして標準で mintty というのがインストールされてて、どうやらこのminttyがcygwin 推奨の?端末ソフトらしい。Tera Term Proでもほとんど不満はないのですが、やはりcygwin 関係はcygwin 内ですべてを完結させたいところ。
使ってみると、日本語もちゃんと表示されるし、最低限の機能を備えているので問題なし。Windows7でウィンドウの透過を”Glass”にしたら、結構かっこよく見える(^^;;;

ただ、一点、不満がありまして・・・、それが・・・環境変数 HOME の扱い。Windowsのアプリですでに環境変数HOMEを設定していて、これは変えたくない。

で、どうやら、mintty を起動すると、cygwinのインストーラが作成した、/etc/passwd(実際にはc:cygwinetcpasswd) を見ているらしく、デフォルトでホームディレクトリが、Windowsの%USERPROFILE%になるみたい。

Tera Term Pro では、「設定 → その他の設定」で、環境変数を設定できる項目があるのでHOMEを /home/username と設定することで解決してたんですが・・・。

環境変数HOMEをバッチファイルに埋め込めばいいんだけど、それだといちいちコンソールウィンドウが立ち上がってブサイク。

・・・というわけで、バッチファイル(コマンドファイル)ではなく、wsh + jscript の力を借りて下記のような起動スクリプトを作ってスタートメニューに登録。

var wshl = WScript.CreateObject("WScript.Shell");
var env = wshl.Environment("PROCESS");

env.item('HOME') = '/home/' + env.item('USERNAME');
env.item('MAKE_MODE') = "unix";

wshl.Run("c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -");

vpsへのログインも、cygwin + ssh で。 非WIndows環境はすべてcygwinにしてしまいました。

ええ感じ~、と思っていたら、Tera Term Proで操作ログを常に保存していたのを思い出し・・・mintty のオプション ” -l ” を指定しないと・・・んーーーなんか挫折しそう。

(2012/1/2 : 若干記述修正済み)

HTML DOM access with C#

備忘録です。

System.Net.WebRequest / System.Net.WebResponse クラスを使ってWeb上のHTMLを取得するのは、非常に簡単にできます。MSDNドキュメントにもサンプルがありますし、ネット上でも豊富にサンプルがあるので問題はないです。

が!、取得したHTMLファイルを元に、DOMアクセスさせようとすると途端に.NET Frameworkプログラマーの初心者には、行き詰まってしまいます。 その原因として二つの壁にぶち当たりました。

  1. そもそもHTML の DOMパーサーが、標準でクラスライブラリにない。
  2. Web上から取得したHTMLファイル内に使われている文字コードの判別と、文字コード変換を担うクラスライブラリが標準で提供されていない。

このうち(1)のDOMパーサーについては・・・

Internet Explorer で使われている(正確には WebBrowser コントロールだけど)mshtml.dllが提供するパーサーに任せることができます。mshtml.dll のタイプライブラリが登録されているので、参照を追加することでDOMアクセスができます。具体的には・・・

//HTML内のリンクを列挙するサンプル
using Microsoft;

public static void DomAccessSample(string html)
{
  var hd = new mshtml.HTMLDocument();
  var hd2 = hd as mshtml.IHTMLDocument2;
  
  hd2.write(html);
  foreach (mshtml.IHTMLElement link in hd2.links)
    {
      Console.WriteLine((string)link.getAttribute("href", 0));
    }
}

こんな感じでしょうか。Visual StudioのIDEを使わず、コマンドラインからビルドするには、

#アセンブリの位置はあくまで僕の環境です。 
csc /r:C:\Windows\assembly\GAC\Microsoft.mshtml\7.0.3300.0__b03f5f7f11d50a3a\Microsoft.mshtml.dll ソースファイル.cs

のように、GACに登録されているアセンブリ(DLLファイル)を参照に加えてビルド。

さて、次は、(2)なんですが・・・

MSDNでのサンプルなんかでは、System.Net.WebResponse.GetResponseStream() メソッドから得られるストリーム(Webから取得したバイト列)を、適切なSystem.Text.EncodingとともにSystem.IO.StreamReaderクラスのコンストラクタに渡して、ReadLIneメソッドなどで文字列(string)などを得るようなコードが提示されています。↓のような感じ。

http://msdn.microsoft.com/ja-jp/library/system.net.webresponse.getresponsestream(v=VS.90).aspx

しかしながら・・・このMSDNのサンプルコードには不満があります。というか、このコードの実用性は全く無い。

(サンプルなんだから当然っちゃー、当然なんですけどね。)

だって、取得したストリームに使用されている文字コードをUTF8と決めうちしてるんだもんねぇ~。 Web上のテキスト・リソースは、日本に限っただけでも、主にShift_JIS/EUC-JP/ISO-2022-JP/UTF-8 があるし・・・。

Perlで言えばEncode モジュールのような文字コードを判別する処理が必須なんですけども .NET Framework の標準クラスライブラリにはそういったクラスが無い。まぁ、彼ら(.NET Framework の開発者)からしてみれば同じ言語なのに3つも4つも文字コード規格がある、なんてことにいちいち対応してられないんでしょうね。

で、ストリームから得られたバイト配列の文字コードを判別する方法は、検索してみると、下記に詳しく解説されていますね。

文字コードを判別する (DOBON.NET)

この、mlang を使用する方法がお手軽でいいんじゃないかと・・・。Internet Explorer で使われている mlang.dll を利用します。上記サイトで解説されているのように、mlang.idlファイル(WindowsSDKに同梱されています) から、タイプライブラリを生成してレジストリに登録し、Visual C#のプロジェクトに参照を加えることでmlang(MultiLanguage)を利用します。Visual StudioのIDEを使わない場合は、tlbimp.exe で タイプライブラリからプロキシ(ラッパー?)アセンブリ(DLLファイル)を生成して、コンパイルするときにそのDLLを/rオプションで読み込ませます。

//コードの大半は、上記サイトからのコピペ。
//バイト配列から文字コードを推測して、System.Text.Encoding を返す
using System.Text;
using MultiLanguage;

public static Encoding DetectEncoding(byte[] bytes)
{
  sbyte[] sb = (sbyte[])(object)bytes;
  int len = sb.Length;
  var ml = new CMultiLanguageClass() as IMultiLanguage2;
  int scores = 5; //実際には1で十分だけど
  var detects = new tagDetectEncodingInfo[scores];

  //文字コード判別
  ml.DetectInputCodepage(8|4,0,ref sb[0],ref len,out detects[0],ref scores);

  //DetectInputCodepageメソッドから返ると、scoresには実際にdetect配列に格納された候補数が入っている。
  //返された、DetectEncodingInfoとscores(候補数)を見てみる。
  //DetectEncodingInfo.nCodePageがコードページ。
  //Windows(日本語)なら932とかUTF-8なら65001とか入っているはず。
  Console.Error.WriteLine("Scores = {0}",scores);
  for(int i=0;i<scores;i++)
    {
      Console.Error.Write("CodePage[{0}] = {1}; ",i,(int)detects[i].nCodePage);
      Console.Error.Write("Confidence[{0}] = {1}; ",i,(int)detects[i].nConfidence);
      Console.Error.Write("Percentage[{0}] = {1}; ",i,(int)detects[i].nDocPercent);
      Console.Error.WriteLine("");
    }

  //一番初めのtagDetectEncodingInfoのEncodingを取得
  Encoding enc = Encoding.GetEncoding((int)detects[0].nCodePage);

  //後始末らしい。
  System.Runtime.InteropServices.Marshal.ReleaseComObject(ml);

  return enc;
}

COMインターフェイスのIMultiLanguage2::DetectInputCodepage() メソッドは、複数の候補を返すことができ、DetectEncodeInfo 構造体にどのくらい正確かを示すint値が入っているようで、それらから判断するようです。ちなみに、IMultiLanguage2::DetectInputCodepage() メソッドの第一引数には、判別するバイト列がどのようなものかを予め入力できて、僕は、4(MLDETECTCP_DBCS) | 8(MLDETECTCP_HTML) = 12 を指定しました。

ただ、僕の環境~WIndows7 x64版~では、WindowsSDK v7.0 + .NET Framework 3.5 だと、ソースをビルドするとき、ターゲットプラットフォームを X86 (つまり32ビットね) にしないと、メチャクチャなコードページ値が返るか、COM参照の例外(HRESULT: E_FAIL)が発生して落ちてしまいます。
ノートパソコン(VAIO Z)の方は、WindowsSDK v7.1 + .NET Framework 4 なんですが、こちらはエラーが出ず正常。

ちょっと原因分からず。タイプライブラリはちゃんと64bit,32bitとともに登録しているんですが・・・やり方が間違ってんでしょうかねぇ・・・IE9をインストールしているので、古いWindowsSDKだとダメなのかもしれませんね(あくまで推測)

ただ、.NET Framework から COM を利用するあたりのマーシャリングとかの仕組みがいまいち分かってないので、また勉強しないといけないな~。