首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DynamicMethod预链接

DynamicMethod预链接
EN

Stack Overflow用户
提问于 2012-12-01 09:16:09
回答 2查看 377关注 0票数 5

我是一个用C#制作的psp模拟器的作者。

我正在使用ILGenerator生成大量的"DynamicMethod“。我正在将汇编代码转换为AST,然后生成IL代码并构建该DynamicMethod。我在另一个线程中这样做,所以我可以在程序执行其他方法的同时生成新的方法,这样它就可以顺利地运行。

我的问题是本机代码生成是惰性的,所以机器代码是在调用函数时生成的,而不是在生成IL时生成的。所以它在程序执行线程中生成,本机代码生成非常慢,因为它是asm->ast->il步骤。

我已经尝试了Marshal.Prelink方法,该方法建议在执行函数之前生成机器码。它可以在单声道上工作,但不能在MS .NET上工作。

代码语言:javascript
复制
Marshal.Prelink(MethodInfo);

有没有办法在MS .NET上预链接到DynamicMethod?

我想向函数添加一个布尔参数,如果设置了这个参数,就会立即退出函数,这样实际上就不会执行任何代码。我可以通过这种方式“预链接”,但我认为这是一个我想要避免的糟糕的解决方案。

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2012-12-01 12:59:06

I found someone saying that creating a delegate to the dynamic method would force JIT:

创建一个以方法为目标的委托。这有什么意义呢?

This one sounds promising too:

代码语言:javascript
复制
Thread jitter = new Thread(() =>
{
  foreach (var type in Assembly.Load("MyHavyAssembly, Version=1.8.2008.8," + 
           " Culture=neutral, PublicKeyToken=8744b20f8da049e3").GetTypes())
  {
    foreach (var method in type.GetMethods(BindingFlags.DeclaredOnly | 
                        BindingFlags.NonPublic | 
                        BindingFlags.Public | BindingFlags.Instance | 
                        BindingFlags.Static))
    {
      System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod(method.MethodHandle);
    }
  }
});
jitter.Priority = ThreadPriority.Lowest;
jitter.Start();
票数 0
EN

Stack Overflow用户

发布于 2013-01-13 02:52:53

阅读MSDN文档中有关其无法工作的原因的信息时,会得出以下结论:

在平台调用之外的方法上调用预链接没有任何效果。

我非常确信,如果你使用restrictedskipverificationskipverification,它就会破坏你的方法。

不过,如果我错了,你的短路想法还不错。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13655402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档