Мне нужно преобразовать существующий код, который использует Reflection.Emit to Roslyn.Convert Reflection.Emit to 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
, и это не тривиально.
Было бы здорово, если бы мы могли просто Рослин компилировать код:
public class Entry
{
public void ###Start_v1.4.3.0()
{
}
}
Но это не работает в связи с именем метода является недействительным.
Скомпилированная DLL-версия используется сторонним компонентом и ищет этот класс и имя метода. Мы попытались довести разработчиков до новой версии, но не повезло.
Я думаю, что Roslyn не будет компилировать это вообще, но я считаю, что может быть способ переименовать имя метода позже, скажем, только Start()
- ###Start_v1.4.3.0()
... Я просто не знаю, как это сделать.
Любая помощь будет очень желанной.
Я полагаю, вы могли бы использовать [ILDASM] (https://msdn.microsoft.com/en-us/library/f7dy01k1.aspx) и [ILASM] (https://msdn.microsoft.com/ en-us/library/496e4ekx.aspx) или Cecil для последующего патча. –
Возможно, вам стоит задать запрос функции, чтобы разрешить имена произвольных членов. У CLR нет проблем с этими именами, и я не думаю, что в Roslyn что-то не удастся от этого. – usr