Windows phone 7 如何使用CCI或Mono.Cecil从头开始创建新的Windows Phone 7程序集

Windows phone 7 如何使用CCI或Mono.Cecil从头开始创建新的Windows Phone 7程序集,windows-phone-7,code-generation,mono.cecil,cci,Windows Phone 7,Code Generation,Mono.cecil,Cci,我正在开发一个为WP7生成程序集的工具。我是在完整的框架下这样做的。由于Reflection.Emit不适用于WP7,但CCI或Mono.Cecil都适用,所以我想知道是否有一种方法可以从头开始创建新程序集。我已经知道我可以修改现有的程序集,但是能够创建一个程序集将非常有用。 我想解决办法是在visual studio中生成一个空程序集并将其作为模板,但我认为应该有更好的方法。使用Mono很容易。Cecil: using Mono.Cecil; using Mono.Cecil.Cil; cl

我正在开发一个为WP7生成程序集的工具。我是在完整的框架下这样做的。由于Reflection.Emit不适用于WP7,但CCI或Mono.Cecil都适用,所以我想知道是否有一种方法可以从头开始创建新程序集。我已经知道我可以修改现有的程序集,但是能够创建一个程序集将非常有用。
我想解决办法是在visual studio中生成一个空程序集并将其作为模板,但我认为应该有更好的方法。

使用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程序集为目标的程序集解析器创建模块
  • 一个小技巧,以确保模块选择正确的winphone mscorlib(将在下一版本的Cecil中修复)
  • Silverlight程序集具有.net 2.0 framework的元数据版本

值得指出的是,虽然您可以使用备用框架在手机运行时生成动态程序集,但您无法加载/执行它们。如果由应用程序代码执行,这些API将抛出异常。

没错。。。我可以引用它,但我不能使用它it@cloudraven,不,这是一个完全不同的问题。问题是您可以在运行时在WP7应用程序中生成程序集,但是您没有任何东西可以加载程序集。这与理查德在下面提到的有关。我试图加载这个示例生成的测试程序集,并调用类型为“type”的静态方法“Identity”,我立即得到一个应用程序未处理的异常。有可能克服这个问题吗?@cloudraven:同样,这是无关的。在这种情况下,我粘贴的示例包含一个输入错误,并触发了一个无效程序集的创建。始终使用peverify检查您是否发出正确的代码。我更新了示例以生成完全有效的程序集。我明白了。谢谢我在以前的版本中运行了peverify来理解这个问题。程序集的名称不能具有扩展名。现在它可以正常工作了