0

簡単なタスクを実行したいと思います。いくつかの.NETルーチンを呼び出すC++/ CLIライブラリを作成し、純粋なネイティブC++アプリから呼び出すことができる1つの静的メソッドを公開します。ネイティブアプリからそのlibに静的にリンクしたい。ネイティブC++アプリが呼び出すメソッドのシグネチャは次のようになります。

void (unsigned char* data, int length, _TCHAR* args[])

私は一般的にC++/CLIとC++にかなり慣れていません。だから、私を助けてこれらの質問に答えてくれませんか:

  1. 私の小さなC++/ CLIプロジェクトでは、タイプは、出力としてlibを使用し、vc9ランタイムを対象とするクラスライブラリである必要があると想定しています(エンドユーザーのPCで確実に使用できるようにするため)。私はこの仮定で正しいですか?

  2. C ++/CLIプロジェクトで記述する必要のあるその署名を持つメソッドの概要の例を教えてください。特に、CLRタイプ(つまり、byte []、int32、およびstring)への変換を適切に行うにはどうすればよいですか?そして、そのメソッドを「extern "C" __declspec(dllexport)」のようなもので装飾して、このメソッドをネイティブC ++アプリから呼び出し可能にするにはどうすればよいですか?

  3. C ++ / CLIのcppファイルとhファイルの間でコードを適切に分離するにはどうすればよいですか?

  4. 最後に、lib参照を追加したら、ネイティブアプリから実際にどのように呼び出すのでしょうか。

ありがとうございました。

4

1 に答える 1

1
  1. クラスライブラリ:正解ですが、プロジェクトの構成タイプをダイナミックライブラリから静的ライブラリに変更する必要もあります。「vc9ランタイムをターゲットにする」とはどういう意味かわかりません。静的ライブラリを使用するネイティブコードと同じランタイムをターゲットにする必要があります。

  2. これは静的ライブラリで__declspec(dllexport)あるため、必要ありません。.NETタイプへの変換方法を知りたい場合は、コードが実際に行っていることを投稿する必要があります。一般にMarshal::Copy、C配列を.NET配列にmarshal_as<>コピーし、C文字列を.NET文字列にコピーする必要がありますが、そのデータが可変であることが意図されており、マーシャリングする必要があるかどうかについてはまだ疑問があります。戻る前にネイティブタイプに戻る...

  3. C ++の場合とまったく同じ–ヘッダーでの宣言、ソースファイルでの定義。

  4. 他の関数とまったく同じ–#include宣言を含むヘッダーと関数の呼び出し。

于 2012-04-26T19:55:08.933 に答える