Windows phone 7 如何使用CCI或Mono.Cecil从头开始创建新的Windows Phone 7程序集
我正在开发一个为WP7生成程序集的工具。我是在完整的框架下这样做的。由于Reflection.Emit不适用于WP7,但CCI或Mono.Cecil都适用,所以我想知道是否有一种方法可以从头开始创建新程序集。我已经知道我可以修改现有的程序集,但是能够创建一个程序集将非常有用。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
我想解决办法是在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的元数据版本