Windowsのユニバーサルプロジェクトにboost.asioをどのようにして共有コンポーネントに追加できますか?windows universal appプロジェクトにboost.asioを追加するには?
別のプロジェクトを作成してそこにヘッダファイルを含める必要がありますか、それとも簡単な方法がありますか?
ありがとうございます!
Windowsのユニバーサルプロジェクトにboost.asioをどのようにして共有コンポーネントに追加できますか?windows universal appプロジェクトにboost.asioを追加するには?
別のプロジェクトを作成してそこにヘッダファイルを含める必要がありますか、それとも簡単な方法がありますか?
ありがとうございます!
ユニバーサルアプリケーションの詳細についてはあまりにも(私はその主題に関する権威ではありませんが)あまりにも多くのことを学ぶことはできませんが、私はあなたにこれを伝えることができます:boost::asio
はヘッダーのみのライブラリです。つまり、ヘッダーをC++プロジェクトに組み込むだけで、そのコードがメインアセンブリに直接マージされます。この方法で使用することを強くお勧めします。
このヘッダーのみのライブラリを別のDLLに組み込んでメインアプリケーションに追加すると、作業が面倒になります。まず、各ターゲット(x86、x64、ARM)のバイナリをビルドし、それらの依存関係を維持するという頭痛がありますが、実際の頭痛は、共有アセンブリからロードするときにboost::asio
を機能させるために必要なものです。
これを行うには、コード内にwinsock_init
という::asio
という特別な静的メンバーを定義する必要があります。 ::asio
は、インターロックされたエクスチェンジを使用して独自の静的なカスタマイズされた参照カウンタを使用して、独自の使用状況を追跡します。カウンタが0を超えてインクリメントされると、WSAStartup()
などの呼び出しが行われ、ライブラリがWinsockでうまく再生されるようになります。カウンタが再びゼロになると、同じ理由でWSACleanup()
が再び呼び出されます。
winsock_init
は、この機能を回避するので、それはそうでない場合、あなたが完全にASIOを破るつもりだ、正しく、手動で共有アセンブリ内からこれらの関数
を呼び出すためにあなた次第ですし、あなたのアプリケーションは、アプリケーションストアのためのコンプライアンス・テストを失敗します配備共有アセンブリに::asio
をラップしようとしたときにも
、あなたは、DLL内の特別なソースファイル一度だけ、含める必要があり、その後、あなたは、このDLLプロジェクトの両方で特別なブースト設定変数の束を定義する必要がありますこの::asio
dllを使用するプロジェクトです。
私のアドバイスは、ヘッダーだけをプライマリアセンブリに含めるだけで、これらの頭痛のすべてを導入していないことです。もう1つの選択肢は、C++/CLIまたはManaged C++を最近使用しているものを使用し、混在したC++コードから直接.NETソケットクラスにアクセスすることです。
See here ASIOを別のアセンブリにコンパイルする方法の詳細は、私が説明したすべての苦痛に本当に苦しんでいる場合は、こちらをご覧ください。
コメントありがとうございます。しかし、実際は私の質問はより普遍的なアプリ指向でした。そこには、共有クラスを保持する共有コンポーネントがあり、そこにライブラリを追加する方法がわかりませんでした。しかし、いくつかの研究の後で、私はあなたが単にライブラリを2回追加することを発見しました。デスクトップアプリケーションに1回、モバイルに1回。共有クラスはそこから直接使用しました。 ありがとう –
@Gabrielkotev申し訳ありませんが、ASIOを使用するアプリケーションの種類に関係なく、ここで述べた内容がすべて適用されます。あなたの完全なソリューションを共有する答えを投稿し、この質問を閉じるために正しいとマークすることを検討してください。 –