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 程序集的程序集解析器创建模块。
  • 确保模块选择正确的 winphone mscorlib 的小技巧(将在下一版本的 Cecil 中修复)。
  • Silverlight 程序集具有 .net 2.0 框架的元数据版本。
于 2011-07-17T09:14:47.960 回答
2

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

于 2011-07-17T09:19:31.473 回答