質問

  1. Visual Studio 2005 を使用する場合と Visual C++ を使用する場合とで、単純な C DLL を作成する場合の違いは何ですか。スタジオで作成するとマニフェストも作成され、並列フォルダーを使用するため (C# アプリケーションから DLL を呼び出すとき)、別のマシンへのデプロイメントに関していくつかの問題が発生することがわかりました。」
  2. DLL を呼び出すメカニズムはどのように機能しますか?

ありがとう

役に立ちましたか?

解決

1 つ目の質問については novagz がすでに取り上げているので、2 つ目の質問について詳しく説明させてください。理解するのはそれほど難しいことではありません。

Windows で DLL をコンパイルすると、リンカーは、エクスポートされたすべての関数 (DLL が提供する関数) と、それらが DLL 自体で実装される場所へのポインターをリストするエクスポート アドレス テーブル (EAT) を作成します。

DLL にリンクするアプリケーションをコンパイルするとき、リンカーは、他の DLL に実装されているすべての関数と、それらの関数を実装する DLL の名前をリストするインポート アドレス テーブル (IAT) を作成します。DLL に関数が存在するかどうかは、プロジェクトに追加する .lib ファイルから判断されます。これは、関数が DLL に実装されていることをリンカーに伝えます。

次に、実行時に、アプリケーションのロード中に、Windows ローダーは IAT を調べて、どの DLL をロードする必要があるかを確認し、それらを見つけて、ロードされた DLL 内のエクスポートされた関数を指すようにアプリケーション IAT (メモリ内) を更新します。

これが基本的な動作方法です。大幅な不正確さが含まれていないことを願っています。そしてもちろん、P/Invoke はこの上にある別のレイヤーです。

DLL の動作についてさらに詳しい情報が必要な場合は、常に次のリンクを参照してください。 MSDN ドキュメント 頭がくらくらするほど詳しく知りたい場合は、Inside Windows の記事を読んでください。 パート1 そして パート2

他のヒント

あなたが/ MD(デフォルト設定)とDLLのコードをコンパイルする場合は、

はい、あなたは<に持っているのhref =「http://msdn.microsoft.com/en-us/library/ms235316.aspx」のrel = 「nofollowをnoreferrer」>ライブラリがターゲットマシンににCRTを展開。これは単なるスタンドアロンDLLは、他の依存関係なしである場合、それはあなたがライブラリを展開する必要はありませんので、静的なCRTオプションを指定してコンパイルする意味があります。あなたのDLLプロジェクト、プロパティ、C / C ++、コード生成、デバッグ構成のためのランタイムライブラリ= / MTdにを右クリックします。 Release構成を繰り返し、今使用して/ MTます。

管理プログラムから呼び出されたか、アンマネージコードについての詳細を学ぶために、

Googleの「P /呼び出しマーシャリング」ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top