2
我需要將使用Reflection.Emit的現有代碼轉換爲Roslyn。將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
,這不是微不足道的。
這將是巨大的,如果我們可以只是羅斯林編譯代碼:
public class Entry
{
public void ###Start_v1.4.3.0()
{
}
}
但它不工作,由於該方法名稱爲無效。
編譯後的dll由第三方組件使用,它會查找要執行的類和方法名稱。我們試圖讓開發者有一個新的版本,但沒有運氣。
我認爲Roslyn不會編譯這個,但我相信可能有一種方法來重命名方法名稱,比如說我們只需要說Start()
到###Start_v1.4.3.0()
......我只是不知道該怎麼做。
任何幫助將非常受歡迎。
我想你可以使用[反彙編](https://msdn.microsoft.com/en-us/library/f7dy01k1.aspx)和[ILASM(https://msdn.microsoft.com/ en-us/library/496e4ekx.aspx)或Cecil,以便在之後進行修補。 –
也許你應該提出一個允許任意成員名稱的模式的功能請求。 CLR沒有這些名字的問題,我認爲Roslyn中的任何東西都不會因爲允許這樣做而突破。 – usr