Emit(OpCodes.Ldfld, textBox) 铸造失败
Emit(OpCodes.Ldfld, textBox) fails with casting
我正在使用 Reflection.Emit 构建一个简单的动态方法,该方法在一个简单的 WPF 程序 (MyTextBox.Text) 中获取 TextBox 对象的 Text 属性 值。
无法使用 Invoke 正确调用此动态方法,感谢 VisualStudio.DebuggerVisualizers.
,我在此行 'Emit(OpCodes.Ldfld, textBox)' 发现了一些错误
这是调试时 ILStream 的输出:
IL_0000: /* 02 | */ ldarg.0
IL_0001: /* 7b | 04000002 */ ldfld **!"Specified cast is not valid."!**
IL_0006: /* 28 | 06000003 */ call System.String get_Text()/System.Windows.Controls.TextBox
IL_000b: /* 2a | */ ret
这是代码:
namespace MyWPFTest
{
public partial class MainWindow1 : Window
{
public MainWindow1()
{
InitializeComponent();
}
private void MyTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
MyTextBox.Text = "Morning";
DynamicMethod dm = new DynamicMethod("GetTextBoxText", typeof(void), new Type[] { }, typeof(MainWindow1), false);
ILGenerator il = dm.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
FieldInfo textBox = typeof(MainWindow1).GetField("MyTextBox", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance);
if (textBox == null)
{
throw new InvalidOperationException("no textbox");
}
il.Emit(OpCodes.Ldfld, textBox);
var textProperty = typeof(TextBox).GetProperty("Text", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance).GetGetMethod();
if (textProperty == null)
{
throw new InvalidOperationException("no Text property");
}
il.Emit(OpCodes.Call, textProperty);
il.Emit(OpCodes.Ret);
TestShowVisualizer(dm);
dm.Invoke(null, null);
}
}
}
TestSHowVisulalizer()
有助于显示用于调试的 IL 流。
有没有人有使用 TextBox 等 WPF 控件的经验Reflection.Emit?
我写了这段代码 'var a = MyTextBox.Text' 然后使用 ilsdasm 来获取 il。看起来像这样:.locals init ([0] string a) IL_0000: nop IL_0001: ldarg.0 IL_0002: ldfld class [PresentationFramework]System.Windows.Controls.TextBox MyWPFTest.MainWindow1::MyTextBox IL_0007: callvirt 实例字符串 [PresentationFramework]System.Windows.Controls.TextBox::get_Text() IL_000c: stloc.0 IL_000d: ret } // 方法结束 MainWindow1::MyTextBox_TextChanged
如果您阅读 the example on MSDN,您会发现默认情况下您的参数列表中不包含 this
参数。指定 DynamicMethod
的 owner
class 可以让您访问私有成员,但不能访问 this
参数。您的 DynamicMethod 就像 C# 源代码中的 static
方法。
现在你有一个空的参数类型数组,所以没有 Ldarg_0
。
尝试指定参数类型。变化
DynamicMethod dm = new DynamicMethod("GetTextBoxText",
typeof(void),
new Type[] { },
typeof(MainWindow1),
false);
到
DynamicMethod dm = new DynamicMethod("GetTextBoxText",
typeof(void),
new Type[] { typeof(MainWindow1) },
typeof(MainWindow1),
false);
我正在使用 Reflection.Emit 构建一个简单的动态方法,该方法在一个简单的 WPF 程序 (MyTextBox.Text) 中获取 TextBox 对象的 Text 属性 值。
无法使用 Invoke 正确调用此动态方法,感谢 VisualStudio.DebuggerVisualizers.
,我在此行 'Emit(OpCodes.Ldfld, textBox)' 发现了一些错误这是调试时 ILStream 的输出:
IL_0000: /* 02 | */ ldarg.0
IL_0001: /* 7b | 04000002 */ ldfld **!"Specified cast is not valid."!**
IL_0006: /* 28 | 06000003 */ call System.String get_Text()/System.Windows.Controls.TextBox
IL_000b: /* 2a | */ ret
这是代码:
namespace MyWPFTest
{
public partial class MainWindow1 : Window
{
public MainWindow1()
{
InitializeComponent();
}
private void MyTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
MyTextBox.Text = "Morning";
DynamicMethod dm = new DynamicMethod("GetTextBoxText", typeof(void), new Type[] { }, typeof(MainWindow1), false);
ILGenerator il = dm.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
FieldInfo textBox = typeof(MainWindow1).GetField("MyTextBox", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance);
if (textBox == null)
{
throw new InvalidOperationException("no textbox");
}
il.Emit(OpCodes.Ldfld, textBox);
var textProperty = typeof(TextBox).GetProperty("Text", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance).GetGetMethod();
if (textProperty == null)
{
throw new InvalidOperationException("no Text property");
}
il.Emit(OpCodes.Call, textProperty);
il.Emit(OpCodes.Ret);
TestShowVisualizer(dm);
dm.Invoke(null, null);
}
}
}
TestSHowVisulalizer()
有助于显示用于调试的 IL 流。
有没有人有使用 TextBox 等 WPF 控件的经验Reflection.Emit?
我写了这段代码 'var a = MyTextBox.Text' 然后使用 ilsdasm 来获取 il。看起来像这样:.locals init ([0] string a) IL_0000: nop IL_0001: ldarg.0 IL_0002: ldfld class [PresentationFramework]System.Windows.Controls.TextBox MyWPFTest.MainWindow1::MyTextBox IL_0007: callvirt 实例字符串 [PresentationFramework]System.Windows.Controls.TextBox::get_Text() IL_000c: stloc.0 IL_000d: ret } // 方法结束 MainWindow1::MyTextBox_TextChanged
如果您阅读 the example on MSDN,您会发现默认情况下您的参数列表中不包含 this
参数。指定 DynamicMethod
的 owner
class 可以让您访问私有成员,但不能访问 this
参数。您的 DynamicMethod 就像 C# 源代码中的 static
方法。
现在你有一个空的参数类型数组,所以没有 Ldarg_0
。
尝试指定参数类型。变化
DynamicMethod dm = new DynamicMethod("GetTextBoxText",
typeof(void),
new Type[] { },
typeof(MainWindow1),
false);
到
DynamicMethod dm = new DynamicMethod("GetTextBoxText",
typeof(void),
new Type[] { typeof(MainWindow1) },
typeof(MainWindow1),
false);