2

WP7 のアセンブリを生成するツールに取り組んでいます。私は完全なフレームワークからこれを行っています。Reflection.Emit は WP7 では機能しませんが、CCI または Mono.Cecil は機能するため、新しいアセンブリを最初から作成する方法があるかどうか疑問に思っています。既存のアセンブリを変更できることは既に知っていますが、アセンブリを作成できると非常に便利です。回避策は、Visual Studio で空のアセンブリを生成し、それをテンプレートとして保持することだと思いますが、もっと良い方法があるはずだと思います。

4

2 に答える 2

2

Mono.Cecilを使用すると非常に簡単です。

using Mono.Cecil;
using Mono.Cecil.Cil;

class Demo
{

    static void Main()
    {
        var winphoneAssemblies = @"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone";

        var assemblyResolver = new DefaultAssemblyResolver();
        assemblyResolver.AddSearchDirectory(winphoneAssemblies);

        var winphoneCorlib = assemblyResolver.Resolve("mscorlib");

        var module = ModuleDefinition.CreateModule("Test", new ModuleParameters
        {
            AssemblyResolver = assemblyResolver,
            Runtime = TargetRuntime.Net_2_0,
            Kind = ModuleKind.Dll,
        });

        // trick to force the module to pick the winphone corlib
        module.Import(winphoneCorlib.MainModule.GetType("System.Object"));

        var type = new TypeDefinition("Test", "Type", TypeAttributes.Public | TypeAttributes.Sealed | TypeAttributes.Abstract, module.TypeSystem.Object);
        module.Types.Add(type);

        var method = new MethodDefinition("Identity", MethodAttributes.Public | MethodAttributes.Static, module.TypeSystem.Int32);
        method.Parameters.Add(new ParameterDefinition("i", ParameterAttributes.None, module.TypeSystem.Int32));

        type.Methods.Add(method);

        var il = method.Body.GetILProcessor();
        il.Emit(OpCodes.Ldarg_0);
        il.Emit(OpCodes.Ret);

        module.Write("Test.dll");
    }
}

注意すべきいくつかのこと:

  • Winphoneアセンブリを対象とするアセンブリリゾルバを使用してモジュールを作成する必要があります。
  • モジュールが適切なwinphonemscorlibを確実に取得するためのちょっとしたトリック(Cecilの次のバージョンで修正される予定です)。
  • Silverlightアセンブリには、.net2.0フレームワークのメタデータバージョンがあります。
于 2011-07-17T09:14:47.960 に答える
2

代替フレームワークを使用して電話のランタイム内から動的アセンブリを生成できる場合もありますが、それらをロード/実行することはできません。これらのAPIは、アプリケーションコードによって実行されると、例外をスローします。

于 2011-07-17T09:19:31.473 に答える