我正在开发一种为 WP7 生成程序集的工具。我是从完整的框架中做到这一点的。由于 Reflection.Emit 不适用于 WP7,但无论是 CCI 还是 Mono.Cecil,我都想知道是否有办法从头开始创建新程序集。我已经知道我可以修改现有的程序集,但能够创建一个将非常有用。我想一种解决方法是在 Visual Studio 中生成一个空程序集并将其保留为模板,但我认为应该有更好的方法。
问问题
661 次
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 回答