c# – 如何使用来自同一程序集的静态变量的动态方法?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何使用来自同一程序集的静态变量的动态方法?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2130字,纯文字阅读大概需要4分钟。
内容图文
我创建了一个动态方法,但是当我尝试访问外部资源时,它给了我一个例外
TargetInvocationException: Exception has been thrown by the target of
an invocation.
基本上我想写一个字节数组的方法,然后将其作为动态方法加载.我知道一个简单的字节数组不足以重建元数据链接,但是如何使用来自同一程序集的变量的动态方法呢?
我试图转换该代码:
public static int z = 10;
public static int sum(int x, int y) {
return x + y + z;
}
这给了我IL:
0 L_0000: ldarg.0
1 L_0001: ldarg.1
2 L_0002: add
3 L_0003: ldsfld System.Int32 CodeGen.Program::z
4 L_0008: add
5 L_0009: ret
哪个是字节:
02 03 58 7E 06 00 00 04 58 2A
我测试了它:
public static int z = 10;
static void Main(string[] args) {
DynamicMethod sum = new DynamicMethod("sum", typeof(int), new Type[] { typeof(int), typeof(int) });
var info = sum.GetDynamicILInfo();
var bytes = new byte[] { 0x02, 0x03, 0x58, 0x7E, 0x06, 0x00, 0x00, 0x04, 0x58, 0x2A }; // { 0x02, 0x17, 0x58, 0x2A }; // this is a code for int sum(int x, int y) { return x + y; }
info.SetCode(bytes, 8);
var sig = SignatureHelper.GetMethodSigHelper(CallingConventions.Standard, typeof(int));
byte[] bsig = sig.GetSignature();
bsig[0] = 0x7;
info.SetLocalSignature(bsig);
int x = (int) sum.Invoke(null, new object[] { 10, 20 });
Console.WriteLine(x.ToString());
Console.ReadLine();
}
TL; DR我想修复表示动态方法IL的字节数组的引用.怎么做?另外,我不想使用ILGenerator(),我想要一个字节数组.
解决方法:
元数据令牌不能按原样重用;相反,你需要使用DynamicILInfo.GetTokenFor来获得一个与你可以使用的字段相对应的新标记.在你的情况下,这看起来像这样:
var tok = info.GetTokenFor(typeof(...).GetField("z").FieldHandle);
bytes[4] = tok;
bytes[5] = tok >> 8;
bytes[6] = tok >> 16;
bytes[7] = tok >> 24;
但是,您可能还需要创建DynamicMethod,以便禁用JIT可见性检查,或者无论如何您的方法都无法访问私有字段.
在一个不相关的说明中,我不清楚你在使用签名信息做什么 – 看起来你出于某种原因将局部变量签名设置为修改后的方法签名…我认为你应该做更多的事情改为:
info.SetLocalSignature(SignatureHelper.GetLocalVarSigHelper().GetSignature())
当然,您需要根据您的方法实际使用的本地人来改变这一点.
内容总结
以上是互联网集市为您收集整理的c# – 如何使用来自同一程序集的静态变量的动态方法?全部内容,希望文章能够帮你解决c# – 如何使用来自同一程序集的静态变量的动态方法?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。