Как я могу создать новую сборку Windows Phone 7 с нуля, используя CCI или Mono.Cecil - PullRequest
2 голосов
/ 17 июля 2011

Я работаю над инструментом для генерации сборок для WP7. Я делаю это из полной структуры. Поскольку Reflection.Emit не работает с WP7, а с CCI или Mono.Cecil, мне интересно, есть ли способ создавать новые сборки с нуля. Я уже знаю, что могу изменить существующие сборки, но возможность их создания была бы весьма полезна. Я думаю, что обходной путь - это создать пустую сборку в visual studio и сохранить ее как шаблон, но я думаю, что должен быть лучший способ.

Ответы [ 2 ]

2 голосов
/ 17 июля 2011

Стоит отметить, что, хотя вы можете генерировать динамические сборки из среды выполнения телефона, используя альтернативные платформы, вы не собираетесь загружать / выполнять их. Эти API выдают исключение, если выполняются кодом приложения.

2 голосов
/ 17 июля 2011

Это довольно легко сделать с 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сборки.
  • Небольшой трюк, чтобы убедиться, что модуль подхватывает правильный winscon mscorlib (будет исправлено в следующей версии Cecil).
  • Сборки Silverlight имеют версию метаданных .net2.0 рамки.
...