6

Windows CE 6 および Compact Framework のマネージ C# で記述された大量の新しいビジネスおよびコミュニケーション ロジックと組み合わせることで、新しい製品で使用したい UI を提供する広範なアンマネージ Windows CE 5 C++ コードがあります。

UI はビジネス ロジックを認識している可能性がありますが、ビジネス ロジックが UI を認識しないようにして、後でマネージ バージョンまたはフロントエンドとして選択したその他の UI に置き換えることができるようにする必要があります。

COM を Windows の世界でブリッジとして使用する方法を説明している記事を見つけましたが、WinCE の下で .NET CF に適用するのに苦労しています。過去に、タイプ ライブラリをインポートし、COM 呼び出し (CoInitialize()、CoCreateInstance()) を使用して、他の Windows プラットフォームのインターフェイスへのポインターを取得しました。同じ機能が WinCE で提供されていると仮定して、マネージ ライブラリの C# インターフェイスにアクセスするためのアンマネージ C++ ライブラリ。

これが私の問題です:タイプライブラリ。過去に '#import "SomeCPPLibrary.dll"' ステートメントを介して使用したため、マネージ C# ライブラリからは利用できません。これは .dll アセンブリに埋もれており、以前とは異なる方法で保存されているため、ライブラリ自体の #import を通じて直接利用することはできないと思います。typelib を #import できると思いますが、マネージ .dll から typelib を抽出する方法が見つかりません。インターフェイス定義ファイル (.idl) を一緒にハックして、プラットフォームの midl.exe を使用できるかもしれません。それから .tlb を生成するために、私の .idl とその結果の .tlb が実際に私の C# .dll にあるものと一致するという保証はありません。プラットフォーム midl.exe がこのように機能するかどうかはわかりませんが、機能すると仮定します。

  1. 私は間違った木を吠えていますか?対応する COM インターフェイスを介してアンマネージド C++ でマネージド C# インターフェイスを使用することは可能ですか?

  2. AssemblyInfo.cs ファイルで [assembly: ComVisible(true)] 属性を設定すると、マネージ アセンブリのすべてのインターフェイスが、AssemblyInfo.cs が定義する GUID を介してアンマネージ ワールドの COM を介して利用できるようになりますか?

  3. アンマネージ C++ ライブラリが #import できるように、マネージ .dll から typelib を取得するにはどうすればよいですか?

  4. マネージ C# ライブラリ プロジェクトをアンマネージ C++ ライブラリ プロジェクトの参照として追加しようとしましたが、うまくいきませんでした。このような状況では、そのような参照はまったく関係がありますか?

  5. アンマネージド C++ の世界からマネージド C# コードを呼び出すという基本的な問題を解決するためのより良い方法はありますか? ここで読んだのは、管理されていない/管理されているギャップを埋めるための管理された翻訳レイヤーを備えた混合モードのライブラリです。呼び出し応答速度は重要な要素であるため、これが良い戦略かどうかはわかりませんが、ある時点で UI をマネージド C# に書き直す予定であるため、長期的にはその方が良いかもしれません。より永続的なビジネス/通信ロジックをいじるのではなく、使い捨ての UI を使用しますか? この質問への回答に関係なく、好奇心以外の理由がなければ、COM の使用に関する問題を解決したいと思います。

4

2 に答える 2

3

WinCE で C++ から C# を呼び出そうとしました。Compact Framework によって提供される COM サポートはないと思うので、ComVisible(true) を使用することはできません。

また、C++ で .NET をホストする方法を見つけることもできませんでした。これもまた、その機能が Compact Framework で公開されていなかったためです。

私の解決策は、スタブ C# アプリケーションを作成し、メッセージ キューを介して C++ ホストと通信することでした。これにより、データ マーシャリングの問題も解決されます。私の使用のパフォーマンスは問題ありません。最大のコストは、完全なアプリが C# である場合にとにかく支払わなければならないスタブの起動時間です。

于 2009-05-12T12:57:03.957 に答える
2

あなたは間違った木を吠えています。ネイティブコードがマネージコードを呼び出すには、ネイティブコードがCLRの実行エンジンを起動する必要があります。これはCLRホスティングと呼ばれ、CFではサポートされていません。これは、創造的なハッキングでさえも、あなたがそれを行うことができないことを意味します(私を信じてください、私はすべての路地を試してきました)。

于 2009-05-12T14:18:15.857 に答える