5

主に C# (サービス、マルチスレッドなど) で書かれた大規模なプロジェクトがあります。ただし、コアの数値計算アルゴリズムは、高速になるようにアンマネージ C++ で記述されています (OpenMP など)。

残念ながら、現時点では、これら 2 つの世界の間でデータを交換するために多くの努力をしなければなりません。つまり、C++ クラスごとに C++/CLI でラッピング クラスを作成する必要があります。(事実上) C# の「世界」で必要な設定 (プロパティ) については、C++ の世界 (ヘッダー ファイル) にコピーがあり、ラッパー クラスで明示的な変換が行われます。このアーキテクチャは非常に非効率的で、エラーが発生しやすいようです。

主な質問: アンマネージ C++ で何らかの方法で自動的に C# クラスをプロパティと共有する方法はありますか? (私たちは読み書きしなければなりません!)

二次的な質問: 上記のような場合にアーキテクチャを改善する方法について何かアドバイスをいただけますか。私たちの考慮事項の 1 つは、完全に C++ に切り替えることでしたが、適切なライブラリを見つけて、現在 .NET で行っているすべての (システム) 処理に対してクリーンなコードを記述しなければならないのは気分が悪いものです。

よろしくお願いします、ヤコブ

4

1 に答える 1

1

私の主なタスクは、マネージド インターフェイスを特定の高パフォーマンスで低レイテンシの dll に書き込むことであるという私の仕事で同様の問題に取り組んでいます。ネイティブ コードがサーバー側のパブリッシャーであり、マネージ コードがデリゲートを使用してそれをサブスクライブする必要がある、つまりネイティブ コールバックに変換する必要がある、ネイティブ クラスまたはより複雑な問題。私の知る限り、内部の .NET は洗練された COM サーバーです。ComVisible 属性を true に設定して .net アセンブリを作成すると、従来の COM コンポーネントとして機能し、ネイティブ C++ コードから COM コンポーネントとして使用できます。http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.aspx ) および MarshalAsAttribute ( http://msdn.microsoft.com/en-us/library/system.runtime. interopservices.marshalasattribute.aspx ) unsafe キーワードも使用することがあります。パフォーマンスの高いコードを扱う必要があるため、場合によっては、プロファイリングを行った後で、どちらが最適なソリューションであるかがわかります。あなたが言及したwarpperクラスのソリューションであろうと、古典的なCOMの方法であろうと、キャッシングやオブジェクトプーリングなどを備えたある種のハイブリッドであろうと.

それが役立つことを願っています。:)

少しまとまりがないように見える場合は、お詫び申し上げます。ここでは非常に遅いです。:)

于 2012-04-05T21:59:24.743 に答える