我正在研究一个为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将抛出异常。