Visual Studio のコード分析ツールが、オイラが昔組んだ P/Invoke コードに対して警告を発しています。

> CA1060 'MyClass.WriteFile(...)' は P/Invoke メソッドであるため、 NativeMethods、
> SafeNativeMethods、または UnsafeNativeMethods に名前指定されたクラスで定義しなければなりません。

警告の意味と対処方法は [CA1060](https://docs.microsoft.com/ja-jp/visualstudio/code-
quality/ca1060-move-p-invokes-to-nativemethods-
class?view=vs-2015&redirectedfrom=MSDN)
の解説ページに書いてあり理解できるのですが、ではこの３者をどう使い分けるとよいのかは具体的な方針が書かれていません。

Q1. ここでいう Safe / Unsafe は具体的にどんな安全性を意図しているのでしょうか  
Q2. どう使い分けると (この仕様を提出してきた Microsoft の意図として) 適切ですか  
Q3. 性能的・ユーザーインターフェイス的違いはありますか
CC BY-SA 4.0
2020-02-18T02:17:11.430
63136
2020-07-28T14:04:25.463
8589
question
visual-studio .net
NativeMethods / SafeNativeMethods / UnsafeNativeMethods の使い分け
文面が長くなるので回答欄を使用して私見を述べさせていただきます。  
回答とはなりませんあしからず。回答を得るためないし議論等何らかのきっかけになればと考えました。  
また、.NETの専門家ではないので誤った内容が含まれるかもしれないことをおことわりさせていただきます。

まず、セキュリティとは使用している環境とそのユーザーを守る為のものであるとの前提です。

過去のOSにおいてはそれに「ログインしているユーザーの権限」に依存したセキュリティが設計されていました。  
これは複数のユーザーが同じハードウェアを使用する場合に合理的な考えです。

下って、現行のモバイル用OS等では「アプリケーションの権限」が検査されるのが一般的です。  
また、アプリケーションへの一般的なアクセス権限の付与はインストール時にアプリケーションから要求され、ユーザーによって認証されます。  
重要なリソースへのアクセスは随時検査され、ユーザーに確認を求められる場合もあります。  
加えて、ユーザーは付与したその権限をはく奪することも可能です。

.NET Frameworkは後者のセキュリティのデザインに配慮しているのではないかと想像できます。  
この内容に直接言及した公式な文書を発見できませんでしたが、

<https://docs.microsoft.com/en-us/dotnet/framework/misc/code-access-
security?redirectedfrom=MSDN>  
によると、

(1).NET Frameworkではコードアクセスセキュリティ(CAS)というメカニズムが組み込まれている。  
(2)上記は特定のリソースにアクセスする権限(permission)を検査する。  
(3)検査は呼び出した機能リソースと、呼び出し元の権限を比較して判定される。  
(4)検査は呼び出されたDLL(アセンブリ)内の関数の一連の呼び出しシーケンスの全てに対して行われる。  
(5)これを"stack walk"と呼ぶ。

ですので、この場合のセキュリティは関数またはリソースに対して、呼び出し元がそのアクセス権限を持っているかどうかを調べると解釈できます。

次に [https://docs.microsoft.com/en-us/visualstudio/code-
quality/ca1060?view=vs-2019&redirectedfrom=MSDN](https://docs.microsoft.com/en-
us/visualstudio/code-quality/ca1060?view=vs-2019&redirectedfrom=MSDN) では、

(A) NativeMethods・・・・・・.NETが"stack walk"して検査するので安全です(権限が無いと拒否される)。  
(B) SafeNativeMethods・・・・.NETは検査しません。しかし提供元は安全だと述べました。  
(C) UnsafeNativeMethods・・・.NETは検査しません。提供元は危険であると述べました。

となっています。(A)のメンバはCASが検査するから大丈夫という事だと解釈できます。  
ここからは想像になってしまいますが、(B)と(C)のメンバは特別な権限がないと使用ないし公開ができませんよ。という事なのかもしれません。

で、どのように使い分けるのかの点ですが  
(A)はOSが提供するほぼ全ての関数(GetTickCount()の様な例外もあるでしょうが)。  
(B)はカスタマが提供するDLLの関数への参照で(A)を使用していないもの。  
(C)上記の条件に当てはまらないもの。  
ではないかと想像します。あくまで想像です。  
また、これらに対してどのような使用上のペナルティがあるのかは知りません。

最後に、Q1～Q2に関しては答える能力がないので控えさせていただきます。
CC BY-SA 4.0
2020-02-19T02:27:39.020
63165
2020-02-19T02:27:39.020
3793
63136
answer
Uncle-
Keiさんが説明してくれていますが、NativeMethods、SafeNativeMethods、UnsafeNativeMethodsでクラス名の使い分け、更にクラス名に応じたコードアクセスセキュリティを適用することが目的だったようです。

しかし、[.NET
4からコードアクセスセキュリティが廃止（デフォルトで無効化）](https://www.atmarkit.co.jp/fdotnet/special/dotnet4security_01/dotnet4security_01_01.html)されているので、クラス名の使い分けは今となっては意味がないかもしれません。
CC BY-SA 4.0
2020-02-19T08:43:13.400
63179
2020-02-19T08:43:13.400
4236
63136
answer