я обнаружил причину я получаю «Операция может дестабилизировать выполнения» в DynamicMethod я производящий, и хотя я легко исправить, он оставил у меня, казалось бы, простым вопросом:Кастинг объекта для определенного класса в IL?
- Как бросить ссылку на объект типа «Объект» на определенный тип, чтобы я мог вызывать методы из этого типа в ссылке на объект?
Ниже приведен пример программы. При запуске это приведет к сбою при исключении «Операция может дестабилизировать время выполнения» при компиляции метода.
Проблема заключается в изменении типа объявляемой переменной типа TestClass
вместо Object
, но я все еще хочу знать, как я могу использовать ссылку на соответствующий тип в коде.
В коде я обозначил строку со звездочками. Что я могу испустить кода в тот момент, который сделает ссылку Object
в стеке ссылкой на TestClass
вместо этого, чтобы вызов метода прошел?
Обратите внимание, что я знаю, что это вызов метода, который создает проблему, если я вообще прокомментирую строки, не имеет значения, какой тип является переменной, метод скомпилирован и выполняется отлично.
Вот код.
using System;
using System.Reflection.Emit;
namespace ConsoleApplication9
{
public class TestClass
{
public void TestMethod() { }
}
class Program
{
static void Main(string[] args)
{
Type type = typeof(TestClass);
DynamicMethod method = new DynamicMethod("", typeof(Object), null);
ILGenerator il = method.GetILGenerator();
LocalBuilder variable = il.DeclareLocal(typeof(Object));
// Construct object
il.Emit(OpCodes.Newobj, type.GetConstructor(new Type[0]));
il.Emit(OpCodes.Stloc, variable);
// Call Test method
il.Emit(OpCodes.Ldloc, variable);
// ***************************************** what do I do here?
il.Emit(OpCodes.Call, type.GetMethod("TestMethod"));
// Return object
il.Emit(OpCodes.Ldloc, variable);
il.Emit(OpCodes.Ret);
// Create and call delegate
Func<Object> fn = (Func<Object>)method.CreateDelegate(
typeof(Func<Object>));
Object instance = fn();
}
}
}
Извините за то, что вы так долго игнорировали свой ответ, у меня была ошибка в моем коде, которая показала, что Castclass не был правильным выбором, но когда я это выяснил, я быстро забыл о моем вопросе SO. Спасибо за попытку. –