10

CLRメモリを手動で管理することについて質問している最中に、私はほとんど知らないことに気づきました。

ガベージコレクターがメモリスペースを踏みにじらないように、マネージドコンテキストを終了すると、CLRがスタックに「Cookie」を配置することを認識しています。ただし、私が読んだすべての前提は、Cで記述されたライブラリを呼び出しているということです。

低レベルでデータを管理するために、管理対象コンテキストの外部で、C#でアプリケーションの書き込みレイヤー全体を作成したいと考えています。次に、管理対象レイヤーからこのレイヤーにアクセスします。

この場合、アンマネージC#コードはILにコンパイルされ、CLRで実行されますか?これはどのように作動しますか?

4

2 に答える 2

15

これは、質問で言及したのと同じC#データベースプロジェクトに関連していると思います。

書き込みレイヤー全体をC/C++またはその他の言語で実装することは技術的に可能です。そして、C#で他のすべてを持つことは技術的に可能です。私は現在、いくつかの高性能で低レベルのものにアンマネージコードを使用し、ビジネスロジックと上位レベルの管理にC#を使用するアプリケーションに取り組んでいます。

ただし、タスクの複雑さを過小評価してはなりません。これを行う一般的な方法は、両方の当事者が理解できる契約を設計することです。コントラクトは管理対象言語に公開され、管理対象言語はネイティブアプリケーションへの呼び出しをトリガーします。C#からC ++メソッドを呼び出そうとしたことがあれば、そのアイデアが得られます...さらに、アンマネージコードを呼び出すたびに、パフォーマンスのオーバーヘッドが非常に大きくなり、低レベルのパフォーマンスのアイデア全体が失われる可能性があります。

高性能のリレーショナルデータベースに本当に興味がある場合は、単一の低水準言語を使用してください。

素朴でありながら完全に機能するデータベースの実装が必要な場合は、C#を使用してください。複雑さを完全に理解していない限り、これら2つの言語を混在させないでください。Raven DBを参照してください-C#のみで完全に構築されたドキュメントベースのNoSQLデータベース。

アンマネージドC#コードはILにコンパイルされ、CLRで実行されますか?

いいえ、管理されていないC#などはありません。C#コードは常にILコードにコンパイルされ、CLRによって実行されます。これは、マネージコードがアンマネージコードを呼び出す場合です。アンマネージコードは、C / C ++ / Assemblyなどのいくつかの言語で実装できますが、CLRはそのコードで何が起こっているのかわかりません。

コメントから更新します。C#をネイティブアーキテクチャ固有のコードに直接コンパイルできるツール(ngen.exe)があります。このツールは、JITコンパイル段階を削除し、ネイティブコードを実行可能イメージまたはライブラリに直接配置することにより、管理対象アプリケーションのパフォーマンスを向上させるように設計されています。ただし、このコードは引き続きCLRホストによって「管理」されます。メモリの割り当てと収集、管理されたスレッド、アプリケーションドメイン、例外処理、セキュリティ、およびその他すべての側面は、CLRによって引き続き制御されます。したがって、C#は技術的にネイティブコードにコンパイルできますが、このコードはスタンドアロンのネイティブイメージとして実行されていません。

これはどのように作動しますか?

マネージコードは、アンマネージコードと相互運用します。これを行うには、いくつかの方法があります。

  • .NetInteropを介したコードを介して。これは比較的高速ですが、コードでは少し見苦しいように見えます(さらに、保守/テストが困難です)(C#/ C / Assemblyサンプルを含む優れた記事
  • はるかに遅いアプローチですが、他の言語に対してよりオープンです:Webサービス(SOAP、WS、REST、および会社)、キューイング(MSMQ、NServiceBusなど)、また(おそらく)プロセス間通信。したがって、アンマネージドプロセスは一方の端にあり、マネージドアプリケーションはもう一方の端にあります。
于 2012-09-12T14:02:53.397 に答える
1

これがC#の質問であることは知っていますが、C ++に慣れている場合は、C ++/CLIを検討する価値があるかもしれません。

これにより、C ++コードの一部をマネージドコンテキストまたはアンマネージドコンテキストに選択的にコンパイルできます。ただし、CLRタイプと対話するコードは、マネージドコンテキストで実行する必要があることに注意してください。

C ++コード内からマネージドコンテキストからアンマネージドコンテキストに、またはその逆に移行するための実行時コストを認識していませんが、C#から.net相互運用機能を介してネイティブメソッドを呼び出すコストと同様である必要があると思います。 @oleksiiがすでに指摘しているように、高価です。私の経験では、ネイティブのCまたはC ++ライブラリと頻繁にやり取りする必要がある場合、これは本当に効果があります。私見では、必要な.net相互運用インターフェイスをC#で記述するよりも、C ++/CLIプロジェクト内から呼び出す方がはるかに簡単です。

それがどのように行われるかについてのちょっとした情報については、この質問を参照してください。

于 2012-09-12T18:40:00.630 に答える