static lib を C++/CLI にリンクするとマネージ コードにならないのですか? CLRに該当しないことを意味します。
いいえ、必ずしもそうではありません。C++/CLI では、すべてのマネージド型が MSIL にコンパイルされ、コードは CLR で実行されます。ネイティブ型は、コンパイラ オプションに応じて、MSIL またはネイティブ マシン コードにコンパイルされます。
- この
/clr
オプションでは、ネイティブ コードとマネージ コードが混在して生成されます。
- この
/clr:pure
オプションは、MSIL にコンパイルされたネイティブ型を含むことができるマネージのみのアセンブリを生成します。これは基本的に、オプションでコンパイルされた C# コードと同じように機能し/unsafe
ます。
- この
/clr:safe
オプションは、ネイティブ コードを含まないマネージのみのアセンブリを生成します。これは基本的に、オプションなしでコンパイルされた C# コードのように機能し/unsafe
ます。
C# の C++/CLI で C++ (ネイティブ) 静的ライブラリを使用すると、パフォーマンスが向上しますか? ネイティブ コードではなく、C# 自体でコードを記述できませんか。
すべての最適化の質問と同様に、答えは依存するということです。一方では、ネイティブ コードはマネージ コードよりも高速であることが多く、より高度に最適化できます (SIMD の使用など)。一方、混合モードのアセンブリに関連するパフォーマンス ヒットがあります。通常、C++ 相互運用機能の実装は非常に高速です (C# の P/Invoke よりもはるかに高速です) が、ネイティブ コードへのコンパイルから得られる利点が十分でない場合は、それでも価値がない可能性があります。実際に知る唯一の方法は、2 つのオプションをテストすることです。
マネージ コードは、特にベテランの C++ プログラマーからよく悪口を言われますが、実際には、適切に作成された C# コードは、同等のネイティブ C++ コードよりも高速ではないにしても、同じくらい高速です。また、C++ で自分自身を撃つことははるかに簡単です。そのため、C# の専門家であり、必ずしも C++ の専門家ではない開発者のチームを持っている場合、不十分に作成された遅い C++ コードになる可能性があります。最後に、プロジェクトの残りの部分がすべて C# である場合、メンテナンス コストが削減されるため、同等のパフォーマンスでも許容できる場合があります。