正在询问manually managing CLR memory , 我意识到我知道的很少。
我知道当您退出托管上下文时,CLR 会在堆栈上放置一个“cookie”,这样垃圾收集器就不会占用您的内存空间;然而,在我读过的所有内容中,假设你正在调用一些用 C 编写的库。
我想在托管上下文之外用 C# 编写我的应用程序的整个写入层,以在低级别管理数据。然后,我想从托管层访问这一层。
在这种情况下,我的非托管 C# 代码会编译为 IL 并在 CLR 上运行吗?这是如何工作的?
最佳答案
我假设这与您在问题中提到的同一个 C# 数据库项目有关。
用 C/C++ 或任何其他语言实现整个写入层在技术上是可能的。在 C# 中拥有所有其他内容在技术上是可能的。我目前正在开发一个应用程序,该应用程序将非托管代码用于一些高性能的低级内容,并将 C# 用于业务逻辑和上层管理。
然而,任务的复杂性不容低估。这样做的典型方法是设计一个双方都能理解的契约(Contract)。合约将暴露给托管语言,托管语言将触发对 native 应用程序的调用。如果您曾尝试从 C# 调用 C++ 方法,您就会明白……此外,每次调用非托管代码都会产生相当大的性能开销,这可能会扼杀低级别性能的整个想法。
如果您真的对高性能关系数据库感兴趣,那么请使用单一的低级语言。
如果您想要一个简单但功能完备的数据库实现,只需使用 C#。除非您完全理解其中的复杂性,否则不要混用这两种语言。请参阅 Raven DB - 一种基于文档的 NoSQL 数据库,仅使用 C# 完全构建。
Will my Unmanaged C# code compile to IL and be run on the CLR?
不,没有非托管 C# 这样的东西。 C# 代码总是会编译成 IL 代码并由 CLR 执行。这是托管代码调用非托管代码的情况。非托管代码可以用多种语言 C/C++/Assembly 等实现,但 CLR 不知道该代码中发生了什么。
根据评论更新。有一个工具 (ngen.exe) 可以将 C# 直接编译成本地架构特定代码。该工具旨在通过删除 JIT 编译阶段并将 native 代码直接放入可执行镜像或库中来提高托管应用程序的性能。然而,这段代码仍然由 CLR 主机“管理”——内存分配和收集、托管线程、应用程序域、异常处理、安全性和所有其他方面仍然由 CLR 控制。因此,即使从技术上讲 C# 可以编译成 native 代码,但此代码并未作为独立的 native 镜像运行。
How does this work?
托管代码与非托管代码互操作。有几种方法可以做到这一点:
关于c# - 非托管 C# 代码是否编译成 IL 并在 CLR 上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12389682/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案