.NET CLR InternalCall

6
有没有一种方法可以托管.NET CLR运行时并注册MethodImplOptions.InternalCall函数?(这不是关于P/Invoke的话题)
2个回答

3

SSCLI代码(特别是clr\src\vm\ecall.cpp)表明,没有办法注册InternalCall方法,因为关键的gECClasses表是硬编码的。


实际的API和共享源代码版本有所不同吗? - jameszhao00
当然是这样,但是怎么做呢?我只能建议您启动IDA,一手拿着公共符号,另一手拿着SSCLI代码,深入到mscorwks.dll中去。 - Anton Tykhyy
我在论坛上看到很多人问这个问题 - 他们要么想调用C++ DLL中的某些内容,认为这可能是实现的方法,要么就是从未说明他们想要做什么。无论哪种情况,答案都是“不行”。顺便问一下,你为什么想这样做? - Daniel Earwicker
2
就我所知,我已经在汇编级别上对mscorwks.dll进行了调试,以修复.NET加载器的问题并调查“tail.call”的行为,并且可以确认在这两种情况下,SSCLI和实际机器代码之间存在精确的对应关系。从我所看到的情况来看,SSCLI的大部分内容与CLR相同,只有像GC和codegen这样的敏感内容明显不同,其他内容则被省略。 - Barry Kelly
@Earwicker。我需要避免P/Invok的编组成本。在这种情况下,C++/CLI可能是我选择的方式。此外,我想知道是否可以在VM中创建一些额外的MSIL功能。 - jameszhao00
@James:如果是这样,我会将需要避免p/invoke的性能关键代码分离到一个非托管库中,并用C/C++编写它。或者确实使用C++/CLI。这应该会更容易、更具可移植性。 - Anton Tykhyy

0

IMetaDataImport 是您最好的选择,但我无法保证。这似乎是一个特定于 C++/CLI 的任务。


这里到底是什么意思?如果没有办法使用COM API使InternalCall工作,P/Invoke也不是一个选择,那么C++/CLI是将托管代码转换为非托管代码的最佳(唯一?)方式。 - arul
InternalCall 低于 CLI,所以是 C++/CLI。jameszhao 的问题非常明确,他想要什么。 - Anton Tykhyy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接