如何使用CCI或monocecil从头开始创建新的Windows Phone 7程序集?



我正在研究一个为WP7生成程序集的工具。我是从完整的框架来做这件事的。因为反射。Emit不能与WP7一起工作,但可以与CCI或Mono一起工作。塞西尔我想知道是否有一种方法从头开始创建新的程序集。我已经知道,我可以修改现有的程序集,但能够创建一个将是非常有用的。我想一个解决办法是在visual studio中生成一个空的程序集,并将其作为模板,但我认为应该有一个更好的方法。

使用Mono很容易做到。塞西尔:

using Mono.Cecil;
using Mono.Cecil.Cil;
class Demo
{
    static void Main()
    {
        var winphoneAssemblies = @"C:Program Files (x86)Reference AssembliesMicrosoftFrameworkSilverlightv4.0ProfileWindowsPhone";
        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程序集的程序集解析器创建模块。
  • 一个小技巧,以确保模块拾取正确的winphone mscorlib(将在Cecil的下一个版本中修复)。
  • Silverlight程序集包含。net 2.0框架的元数据版本。

值得指出的是,虽然你可以使用其他框架从手机的运行时中生成动态程序集,但你不能加载/执行它们。如果由应用程序代码执行,这些api将抛出异常。

相关内容

  • 没有找到相关文章

最新更新