y-matsui::weblog

電子楽器、音楽、コンピュータ、プログラミング、雑感。面倒くさいオヤジの独り言

.NET Compact Frameworkでできること/できないこと

現在開発しているWindowsMobileのGPSクライアント関連で、
・exeを実行しているパスを知る方法
・空き領域を調べる方法
EXIFを書きだす方法
を解決するため
.NET Compact Frameworkと.NET Frameworkの違い
.NET Compact Frameworkで出来ないことをちょっと調べた。

■結果
・exeを実行しているパスを調べることはできる。
・(フレームワークの標準機能では)EXIF保存はできない
c#からAPIを利用してドライブの空きを知ることができる。

■.NET Compact Frameworkと.NET Frameworkの違い

System.Drawing.Imageing.ImageFormatクラスでEXIFがサポートされていない。
jpegにタグを付けて保存する操作を実現できない。

System.IO.DriveInfoクラスがサポートされていない。
→ドライブの空き容量を調べる手段がない(?)

■実行パスの取得
string appdir;
//アプリケーションディレクトリの取得
appdir = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).ToString();

APIを利用して空き容量を知る方法
PC向けの.NETフレームワーク2.0ならSystem.IO.DriveInfoっていう便利なクラスがあるんだけど、Mobileではドライブっていう概念がないので、DriveInfoも無い。

//空き容量確認
//thanks to http://pinvoke.net/default.aspx/coredll.GetDiskFreeSpaceEx

[DllImport("coredll.dll", SetLastError = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetDiskFreeSpaceEx(string lpDirectoryName,
out ulong lpFreeBytesAvailable,
out ulong lpTotalNumberOfBytes,
out ulong lpTotalNumberOfFreeBytes);

private double CheckRemain(string drive)
{
double space=0;

ulong FreeBytesAvailable = 0;
ulong TotalNumberOfBytes = 0;
ulong TotalNumberOfFreeBytes = 0;

bool success = GetDiskFreeSpaceEx(drive, out FreeBytesAvailable, out TotalNumberOfBytes,
out TotalNumberOfFreeBytes);
if (!success)
throw new System.ComponentModel.Win32Exception();

//MessageBox.Show("Free Bytes Available:"+ FreeBytesAvailable);
//MessageBox.Show("Total Number Of Bytes:"+TotalNumberOfBytes);
//MessageBox.Show("Total Number Of FreeBytes:"+TotalNumberOfFreeBytes);
space = FreeBytesAvailable;
if (space > 0)
{
space = space / 1024;
}
//MessageBox.Show(space + "MB");

return space;
}

}

■参考サイト
スマート デバイス開発 .NET Compact Framework を使用したデバイスのプログラミング
.NET Compact Frameworkで提供されていない機能は、Wind32 APIを直接呼べばいいよ・・っていうこと知った。

スマート デバイス開発 方法 : プラットフォーム呼び出しを使用して Wave ファイルを再生する (デバイス)
例えば、Weveファイルの操作

ManagedCode
NativeCode
マネージドコードでできること、API呼び出しで実現できることの一覧。

PInvoke.NET
実際のサンプルコードがためになる。
何が出来そうか、眺めているだけでも結構楽しい。
強烈に参考になりました。
RASの接続状態なんかを取れたりするんだね。