始める前に、誰かが提案したり質問したりする前に、混乱を解消させてください..
この質問は、Windows Phone 7 ではなく「Windows Mobile 6 Professional」に関連しており、古いデバイスに移行する必要があるため、Windows Phone 7 に移植することはできません。
さて、それはさておき...
私は現在、Windows Mobile 6 デバイスで実行するためのソースを持っている C# ライブラリを移植しようとしています。今、それは反射です。
.NET コンパクト フレームワークにはいくつかの制限があることは誰もが知っています。「System.Reflection」名前空間の多くのメソッドとプロパティがサポートされていないこともその 1 つです。
ライブラリの実際のデスクトップ バージョンは .NET V2.0 をターゲットにするように設定されており、.NET 3.5 SP1 を実行しているデバイスを使用しているため、ほとんどの場合、動作させるのにほとんど問題はありませんでしたが、そうは見えません。次の 2 つのコード チャンクを機能させるための賢明な方法を見つけます。
var a = AppDomain.CurrentDomain**.GetAssemblies**();
foreach (var assembly in a)
{
if (assembly is System.Reflection**.Emit.**AssemblyBuilder) continue;
if (assembly**.GetType().**FullName == "System.Reflection.Emit.InternalAssemblyBuilder") continue;
if (assembly**.GlobalAssemblyCache** && assembly**.CodeBase** == Assembly.GetExecutingAssembly()**.CodeBase**) continue;
foreach (var t in GetLoadableTypes(assembly))
{
if (t.IsInterface) continue;
if (t.IsAbstract) continue;
if (t.IsNotPublic) continue;
if (!typeof(IGeometryServices).IsAssignableFrom(t)) continue;
var constuctors = t.GetConstructors();
foreach (var constructorInfo in constuctors)
{
if (constructorInfo.IsPublic && constructorInfo.GetParameters().Length == 0)
return (IGeometryServices)Activator.CreateInstance(t);
}
}
}
と
catch (**ReflectionTypeLoadException** ex)
{
var types = ex**.Types**;
IList<Type> list = new List<Type>(types**.Length**);
foreach (var t in types)
if (t != null && t**.IsPublic**)
list.Add(t);
return list;
}
具体的には、上記のコードで太字で示されている項目は、コンパクト フレームワークには存在しないように見えるメソッドとプロパティです。インテリセンスとオブジェクト ブラウザーでかなりの時間を費やした後、私は何も見つけられませんでした。同じ型を返します (または利用可能にします)。
私の質問は次のとおりです。
Compact .NET フレームワークでリフレクションを使用した経験があり、このコードを期待どおりに動作させる方法を提案できる人はいますか?それとも、不足しているメソッドを置き換えるためにカスタム スタブと機能を書き始める必要がありますか?
フレームワークにはいくつかのリフレクション機能があることを知っているので、それを達成する同等の方法があるはずです。
コードを認識できる人のために、最後のメモとして。はい、それは .NET トポロジ スイートからのものであり、はい、私が WM6 バージョンをビルドしようとしているライブラリです。そのため、既にそれを行っている人を知っている場合は、その旨をコメントしてください。簡単な方法を見てみましょう:-)
================================================== ====================
投稿後に更新
「太字」のテキストはコード スニペットでは機能しないようです。そのため、上記のコードで ** で囲まれているメソッド/プロパティは、太字にする必要がある部分です。