2012-04-04 19 views
5

主にC#(サービス、マルチスレッドなど)で書かれた大きなプロジェクトがあります。しかし、コア数のクランチアルゴリズムは、高速(OpenMPなど)にするためにアンマネージC++で書かれています。アンマネージC++コードのC#プロパティを使用

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

プライマリ質問: アンマネージC++で何とか自動的にプロパティを持つC#の-classを共有することがある方法は何ですか?

2次質問: 上記のようなケースでアーキテクチャを改善する方法のアドバイスはありますか?私たちの考えの1つは、C++に完全に切り替えることでしたが、適切なライブラリを見つけて、現時点で.NETで行うすべての(システム)のためのきれいなコードを書く必要がありません。私は私の主なタスクは、特定の高perfromance、低遅延のDLLに管理するインターフェースを記述することである私の仕事で同様の問題を扱っています

あなたの助けに感謝し、よろしく、 ヤコブ

+0

C#でアルゴリズムを書くのがボトルネックであることを確認しましたか? C#4.0は、並列開発のための優れたサポートを提供しています。 – Nick

+0

いいえ、私たちはこれをまだやっておらず、あなたは正しいです:この点について確かめてみるべきです。しかし、私たちがメモリキャッシングなどの特定の特性に頼っているので、アルゴリズムがCLRで同様の速度で実行されることは本当に疑問です。 –

+2

[プロトコルバッファ](http://code.google.com/p/protobuf/)はどうですか? [protobuf-net](http://code.google.com/p/protobuf-net/)を使用してC#と一緒に使用する機能があります。 – megabyte1024

答えて

1

が、これは簡単な例を含み、ネイティブクラスへの未処理のポインタを含む単純なC++/cliを使用してネイティブクラスをラップする必要があります。ネイティブコードはサーバーサイドのパブリッシャであり、マネージコードは代理人を使用してサブスクライバに登録する必要がありますネイティブコールバックに変換されます。 .NETは、私が知る限り、洗練されたCOMサーバーです。 ComVisible属性をtrueに設定して.netアセンブリを記述することは可能です。その後、従来のCOMコンポーネントとして動作し、ネイティブC++コードからCOMコンポーネントとして使用できます。逆のことは、DllImport属性を使用して管理されたネイティブコードを使用することです。すべてのマーシャリングは、StructLayoutAttribute(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の方法、またはいくつかのキャッシングとハイブリッドのいくつかの種類であるかどうか、オブジェクト

お役に立てば幸いです。 :)

少し混乱しているように見える場合は謝罪してください。ここはとても遅いです。 :)

+0

おかげで - 私はすでにMarhsal.StructToPtrと仲間を使用して、当社のラッパーコードの多くをクリーンアップし、私も遠くC#とネイティブC++の世界の両方でC++/CLIのコンポーネントを使用することによって得ることを期待... –

+0

はあなたにヤコブをありがとうS. – ervinbosenbacher

関連する問題