非托管C#代码是否编译成IL并在CLR上运行?

kd8*_*azz 10 c# clr unmanaged

在询问手动管理CLR内存的过程中,我意识到我知之甚少.

我知道当你退出托管上下文时,CLR会在堆栈上放置一个'cookie',这样垃圾收集器就不会破坏你的内存空间; 但是,在我读过的所有内容中,我都假设您正在调用一些用C语言编写的库.

我希望在托管上下文之外的C#中使用我的应用程序的整个写层来管理低级别的数据.然后,我想从托管图层访问此图层.

在这种情况下,我的Unmanaged C#代码是否会编译为IL并在CLR上运行?这是如何运作的?

ole*_*sii 15

我假设这与您在问题中提到的相同C#数据库项目有关.

技术上可以用C/C++或任何其他语言实现整个写层.从技术上讲,在C#中拥有其他所有内容是可能的.我目前正在开发一个应用程序,它将非托管代码用于某些高性能低级别的东西,而C#用于业务逻辑和高级管理.

但是,任务的复杂性不容低估.这样做的典型方法是设计双方都能理解的合同.合同将暴露给托管语言,托管语言将触发对本机应用程序的调用.如果您曾经尝试过从C#调用C++方法,那么您将会得到这样的想法......而且每次调用非托管代码都会产生相当大的性能开销,这可能会破坏低级别性能的整体想法.

如果您真的对高性能关系数据库感兴趣,那么请使用单一的低级语言.

如果您想要一个天真但完全正常工作的数据库实现,只需使用C#.除非您完全理解复杂性,否则不要混用这两种语言.请参阅Raven DB - 基于文档的NoSQL数据库,仅使用C#完全构建.

我的非托管C#代码是否会编译为IL并在CLR上运行?

不,没有非托管C#这样的东西.C#代码将始终编译为IL代码并由CLR执行.托管代码调用非托管代码就是这种情况.非托管代码可以用C/C++/Assembly等几种语言实现,但CLR不知道该代码中发生了什么.

从评论更新.有一个工具(ngen.exe)可以直接将C#编译为本机架构特定代码.此工具旨在通过删除JIT编译阶段并将本机代码直接放入可执行映像或库来提高托管应用程序的性能.但是,此代码仍由CLR主机"管理" - 内存分配和收集,托管线程,应用程序域,异常处理,安全性以及所有其他方面仍由CLR控制.因此,即使C#在技术上可以编译为本机代码,此代码也不会作为独立的本机映像运行.

这是如何运作的?

托管代码与非托管代码互操作.有几种方法可以做到这一点:

  • 通过代码通过.Net Interop.这是相对较快但在代码中看起来有点难看(加上很难维护/测试)(C#/ C /汇编样本的好文章)
  • 一种慢得多的方法,但对其他语言更开放:Web服务(SOAP,WS,REST和公司),排队(如MSMQ,NServiceBus等),也可能(可能)进程间通信.因此,非托管进程位于一端,托管应用程序位于另一端.