3

.Net フレームワークでは、1 つの言語 (C++ など) でライブラリを記述し、そのコードをインポートして、そのライブラリを他の C# プロジェクトでクリーンに使用できるという印象を受けました (両方が同じフレームワーク バージョンをターゲットにしていると仮定します)。

ただし、ポインターではない構造体を取るメソッドパラメーターなど、C# や VB.net などの他の言語では意味をなさない C++ で定義されたメソッドが存在する可能性がある場合、これがどのように機能するかわかりません。 .

おそらく、すべての CLR 言語に関する知識が限られているため、私の例はうまくいきませんが、ある言語にはできて別の言語にはできないことがあると想定する必要があります。これらの不一致がどのように処理されるのかわかりませんと。

4

2 に答える 2

3

メソッド、クラス、構造体、型など、別の言語から直接呼び出すことができないものを1つの.NET言語で作成することは完全に可能です。間接的に(たとえば、リフレクションによって)呼び出すことは常に可能です。

つまり、コンパイルされたC#プロジェクトを見ると、コンパイルされたコードには、通常はジェネリックスをサポートするために、奇妙な名前と文字が含まれているコードが含まれていることがわかります。そのような名前の1つは<Module>(角かっこを含む)です。これは、パブリックメソッドにされたとしても、C#から直接呼び出すことはできません。

CLR用にコンパイルすることを決定した言語設計者は、パブリック型の最小限のサブセットをサポートする必要があります。これはCLSコンプライアンスと呼ばれ、一般的な命名規則、パブリックポインター、パブリックの安全でないメンバーまたはクラス、大文字と小文字のみが異なる名前、パブリック静的フィールド、およびその他のルールに関するものです。彼らがこの規則に従うとき、他の.NET言語があなたのメソッドを呼び出すことができることが保証されます。このためのルールが適切にレイアウトされ、文書化されているため、彼らはこれを行う方法を知っています。

非準拠のC#コードを作成することもできます。(通常は)コンパイルされますが、準拠しているすべての言語がメソッドを呼び出すことができるとは限りません。同じことが、C++。NETを含む他のほとんどの言語にも当てはまります。これは、アセンブリをデフォルトでCLS準拠としてマークするためのMicrosoft設計ガイドラインです(C ++、VB、Rubyで記述されているかどうかは関係ありません)。

于 2012-06-05T20:40:22.690 に答える
2

.NETFrameworkでサポートされている言語の相互運用にはさまざまな種類があります。1つ目は、Abelが話している種類です。.NETコンパイラは、CLI仕様に記述されている形式のアセンブリを生成する必要があります。メタデータ(タイプの説明)とコード(ILまたは中間言語)の厳密な説明を含むEcma-335として標準化されています。これにより、相互運用性を簡単に実現できます。ある言語コンパイラーは別の言語コンパイラーの型を読み取ることができ、.NETランタイムはそれらを連携させます。

しかし、あなたはC ++について話しているのですが、それは管理された言語ではありません。それには、ネイティブコードとの相互運用が必要です。すべてのジッターがネイティブコードも生成するため、これは技術的にはそれほど難しいことではありません。ネイティブコードを記述する方法が必要なだけなので、成功する可能性は十分にあります。3つの異なる方法があります。

  • [DllImport]属性を使用して、ネイティブコードで記述された関数を宣言できます。これは、Cスタイルの呼び出しインターフェイスを公開する言語ランタイムで機能します。WindowsAPIはそのようなものです。これには、少なくともクラスのサポートを利用する場合は、C++は含まれません。

  • CLRは、.NETの祖父であり、Microsoftによって実装された初期の言語相互運用機能であるCOMを適切にサポートしています。特にCOMAutomationサブセットはうまく機能します。COMコンポーネントのタイプライブラリへの参照を追加するだけで、.NETツールが接着剤を自動的に生成して、コンポーネントによって実装されたCOMオブジェクトモデルを管理対象タイプとして公開します。Officeの相互運用機能は、[参照の追加]ダイアログの[COM]タブにあるすべてのものと同様に、そのように機能します。それはかもしれませんCOMは確かにCOMコンポーネントをC++で記述する必要はありませんが、C++で記述されたコードで動作します。VB6とDelphiは、COMを適切にサポートする注目すべき言語です。逆に、.NETコードをCOMとして他のランタイムに簡単に公開できます。WinRT apiは、Windows 8で実行されるMetroアプリを作成できるものですが、言語の予測には十分に隠されていますが、そのコアはCOMベースです。

  • 究極の相互運用ツールであり、C++コードを使用可能にするために使用する必要があるのはC++/CLI言語です。これは、Microsoft C ++コンパイラに組み込まれている拡張機能であり、ネイティブC ++コードをILにコンパイルして、アセンブリに格納できるようにします。マネージクラスをC++スタイルの構文で宣言するオプションを使用すると、マネージコードで直接使用でき、ネイティブC++クラスオブジェクトを作成してそのメソッドを呼び出すことができるクラス。.NET Frameworkのいくつかの部分、特にmscorlib、System.Data、PresentationManagerは、その仕事を遂行するためにネイティブコードに強く依存しているコードのチャンクです。C ++/CLIを究極のグルー言語と考えてください。

于 2012-06-05T21:39:07.440 に答える