2009-08-28 10 views
3

私はクラスライブラリ(dll)を.Netで作成し、今では.NETアプリケーションでそれを使用している開発者がいるとしましょう。.Net - .Netで書かれたクラスライブラリ(DLL)は、CまたはC++で書かれたアプリケーションで使用できますか?

しかし、ライブラリ自体は、ネイティブに(CまたはC++で)書く開発者にとってもおそらく有用かもしれません。だから私の質問は、管理されたDLLをCまたはC++で使用できるかどうかです。

そうでない場合、なぜですか?たぶん、固有のコードを追加する必要があります。

ありがとうございました。

EDIT:誰がこの問題に興味を持っている場合は、私はCOMからNet.classesを使用する方法を紹介しますGoogleブックスからthis記事を見つけました。

答えて

10

CLRベースの言語の外部で.NETアセンブリを公開する唯一の方法は、COM Interopを使用する方法です。 .NET .dllをアンマネージ言語で直接参照することはできません。

この理由は、使用される ".dll"ファイル拡張子は純粋に外見と一貫性の錯覚のためです。 .NETで生成された.dllファイルには、実行時にコンパイルされるIL(中間言語)(Just-In-TimeコンパイルまたはJIT)が含まれています。コードは.dllファイルに配置された時点ではコンパイルされません。その結果、アンマネージ言語が実行されることはありません。

COM相互運用機能は、CLRに.dllを読み込み、そのJITコンパイルを実行し、COMシステムを使用してネイティブコードと.NET .dll間の通信を処理できるようにします。

+0

私には異論はありません!私の知識はそれほどではなく、私は学んでいます。あなたの説明に感謝します。しかし、C++の開発者が自分の管理対象のDLL /アセンブリを呼び出してそのメソッドなどを使用したいと思っている場合、COM Interopを使用している限り、彼のためにCOM Interopを有効にするために私のライブラリで何かしますか?申し訳ありませんすべての質問が、私はむしろこの高度なものに新しいです。 – moster67

+1

.NETでアセンブリをマークする必要があります(これはプロジェクトプロパティです)。これを機能させるには、コードで配管作業を行う必要があります。 .NETアセンブリとクラスをCOMに公開する方法については、多くの記事があります。 C++開発者は、クラスと対話するためにCOMインターフェイスを使用する必要があります。決してシンプルでシームレスなプロセスではありません。 –

+0

アダム:ヒントのために多くのありがとう。私は管理されていない言語で開発している誰かと協力して、これを働かそうとしなければならないと思います。もう一度あなたの助けに感謝します。良い一日/週末を過ごしてください。 – moster67

1

私はアダムロビンソンに同意する必要があります。彼の記述、特にCOMに公開されたプロパティを説明するコメントは、それを実装する確かに1つの方法です。 Thoe otherはCまたはC++アプリケーションにhost the Microsoft CLRを置き、.Net DLLを実行しています。 Monoもホストすることができるかもしれません。純粋な.Net DLLを同等に実行できる必要があります。あなたは完全に吹き飛ばさC++クラスという少ないために解決することができ、およびCOMラッパーを好きではない、 が、あなたは機能の輸出などの静的メソッドを公開できるようにすることthis solutionまたはthis oneを使用する場合や、

+1

@MSalters:アプリケーションでCLRをホストできるのは、アプリケーションを拡張可能にするための素晴らしい方法です。開発者が.NETインターフェイスでプラグインを作成できるようにすることで、アプリケーションで.NET dllを単に使用するための実際の(または実行可能な)ソリューションではありません。このためのC++配管はかなり広範で、直感的にはほとんどありません。私はそれがネイティブコードで.NETアセンブリを使用するという目標を達成するための理論上の可能性を持っていると考えますが、COMソリューションはこれに比べてより適切であり、それほど労力はかかりません。 –

+0

ああ、あなたが「はるかに簡単な方法で...」で始まったならば、私は間違いなくあなたに同意するでしょう。この投稿は、オプションのリストを完成しようとしていただけです。つまり、Monoをホストすることはさらに酷く見えます。それは、ネイティブのLinux Cアプリでこの.Net DLLを使用したい場合、これが唯一の方法かもしれません – MSalters

0

を(つまり、何のP /トリックを起動しません)シンプルなC#はC++構造体として構造化されています。 Visual Studioが必要ですが、マイクロソフトではサポートされていないため、自己責任で使用してください。 私はそれが私のために働いたことを証明することができます。別の方法は、彼のブログでde Icazaに記載されているようにモノとCXXIを使用することです。