【发布时间】:2016-06-28 20:57:40
【问题描述】:
我需要将使用 Reflection.Emit 的现有代码转换为 Roslyn。
我目前的代码基本上是这样的:
var assemblyName = new AssemblyName("AssemblyName");
var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Save);
var builder = assemblyBuilder.DefineDynamicModule("test", "test.dll");
var type = builder.DefineType("Entry", TypeAttributes.Public, typeof(object), null);
var method = type.DefineMethod("###Start_v1.4.3.0", MethodAttributes.Public | MethodAttributes.HideBySig);
method.SetReturnType(typeof(void));
var generator = method.GetILGenerator();
generator.Emit(OpCodes.Nop);
generator.Emit(OpCodes.Ret);
type.CreateType();
assemblyBuilder.Save(@"test.dll");
如您所见,有一个名为Entry 的类和一个名为###Start_v1.4.3.0 的方法。
我们已经使用它超过 7 年了,但每次我们都需要改变任何东西,这很痛苦,因为我们需要使用那些 Emits,而且这不是微不足道的。
如果我们可以让 Roslyn 编译代码,那就太好了:
public class Entry
{
public void ###Start_v1.4.3.0()
{
}
}
但由于方法名无效,无法正常工作。
编译后的 dll 被第三方组件使用,它会寻找这个类和方法名来执行。我们试图联系开发人员以获得新版本,但没有成功。
我认为 Roslyn 根本不会编译它,但我相信以后可能有一种方法可以将方法名称从 Start() 重命名为 ###Start_v1.4.3.0()... 我只是不知道如何这样做。
非常欢迎任何帮助。
【问题讨论】:
-
也许您应该提出功能请求以具有允许任意成员名称的模式。 CLR 对这些名称没有任何问题,我认为 Roslyn 中的任何内容都不会因为允许这样做而中断。
标签: c# roslyn reflection.emit