8

コードがkernel32.dllまたはUser32.dllを呼び出しているのを見るたびに、MSDNであっても、開発者は必要な定数(WM_SETREDRAW = 11など)をルーチンにハードコードする必要があります。これらの定数は定義によって変更されることはなく、常に 1 つの標準定義があるため、.net がそれらをどこかに提供しないのはなぜですか? 必要に応じて、定数と標準の Windows dll 呼び出しの独自のライブラリを作成することになると思います。この重複した作業は無駄が多く、エラーが発生しやすいようです。

おそらく私は十分に調べていませんでした。それらはすべてどこかにあります。もしそうなら、誰かが彼らの場所を提供してもらえますか?

4

3 に答える 3

2

理由は一つではなく、たくさんあります。それらを含めないという決定において、次のいずれかが役割を果たすと考えることができます。

  • フレームワーク アセンブリに取り組んだチームでさえ、pinvoke 宣言の共通セットを共有していませんでした。すべてのチームが独自の宣言を作成しました。
  • Microsoft は、winapi の単一のソースである Windows SDK のみを維持しています。
  • SDK のメンテナーは別のグループであり、.NET を扱ったどのグループとも密接な関係はありません。
  • winapi は 1 つだけではなく、ターゲットの Windows バージョン (C/C++ プログラムをビルドするときに指定するもの) に大きく依存します。これは .NET の粒度に大きく反するものであり、バージョンに依存しません。
  • winapi は巨大で、部分的なバージョンだけでは誰も喜ばないでしょう
  • winapi 関数の pinvoke 宣言は、多くの場合、元の形式から書き直されて、使用法がはるかに単純になります。特に、不透明なポインターを取る種類の関数の場合、SendMessage() は典型的な例です。
  • .NET は、winapi に依存する必要がないように設計されています。とにかく、独自の pinvoke 宣言を使用して不足している部分を埋め戻すことができますが、これが .NET プログラムを実行できるすべての Windows バージョンで機能するという保証は失われます。Windows 98 および 2000 は、引き続き 2.0 で正式にサポートされています。

Pinvoke Interop Assistantツールを使用できます。提供される宣言は、Windows SDK ヘッダーから自動生成されます。

于 2012-07-31T22:25:37.747 に答える
2

実際の答えを提供できるのは .Net チームだけだと思いますが、仮定を立てることしかできません。

おそらく多くの理由があります。ここにいくつかの推測があります:

  • Win32 API はエラーが発生しやすいです。多くの Win32 メソッドでは、開発者が安全でないハンドル (IntPtrオブジェクトとして表されることが多い) を操作する必要があります。これは、.Net のやり方ではありません (たとえば、CreateFile/ ReadFile/ WriteFile/の代わりに FileStream を使用する必要がありますCloseHandle) 。
  • mscorlib に Win32 API 全体を追加しても意味がありません。開発者の 0.1% しか実際に使用していません。
  • Microsoft は開発者がマネージ コードを書くことを好む
  • .Net フレームワークは、プラットフォームに依存しないように設計されています。そのためEnvironment.NewLine、たとえば ( A string containing "\r\n" for non-Unix platforms, or a string containing "\n" for Unix platforms.) が表示されます。したがって、Win32 API 全体を追加しても意味がありません。

Microsoft は名前空間にいくつかの Windows 固有のクラスを追加しましたMicrosoft.Win32が、非常に限定されており、これらの機能は不可欠です (レジストリ操作、ファイルダイアログなど)。

pinvoke.net に関しては、私はあまり頼りません。x64 システムでクラッシュする不適切なメソッド宣言をよく見かけます (構造体レイアウトintの問題ではなくIntPtr...)。別の例:WriteFileメソッドの宣言に一貫性がありません。SafeHandleIntPtr...など。

于 2012-07-31T16:16:47.687 に答える
0

.NET は、完全なエコシステムになるように設計されました。Windows API にドロップすることはハックであり、定数を含めないことは Microsoft のやり方でそれを思いとどまらせます。

于 2012-07-31T16:30:35.910 に答える