実際、設定せずにコードを変更しただけの場合、プログラムの実行後、エラー インターフェイスは以下の図 1 のようになります。
スローされる例外は次のとおりです。
* *********** ** 例外テキスト **************
System.MethodAccessException: セキュリティ透過メソッド 'Rare.Card.Libary.Controls.
による試行メソッド 'Rare.Card.Libary.MifareOneHelper.rf_read(Int32, Int32, Byte[])' を介してネイティブ コードを呼び出すReadCardControl.btnRead_Click(System.Object, System. EventArgs)' が失敗しました。メソッドがセキュリティ クリティカルであるか、
する必要があります。ネイティブ コードを呼び出すセキュリティ セーフ クリティカル。
MSDN に問い合わせると、例外の説明は次のとおりです。
Microsoft .NET Framework 4 では、共通言語ランタイム (CLR) セキュリティ モデルに多くの変更が加えられました。変更の 1 つである、レベル 2 透過性
(Silverlight のセキュリティ モデルに非常に似ています) の採用は、AllowPartiallyTrustedCallers (APTCA) ライブラリの作成者に影響を与える可能性があります。 SecurityTransparent、SecuritySafeCritical、および SecurityCritical の 3 つの透過属性があります。
SecurityTransparent: SecurityTransparent としてマークされたコードは、セキュリティの観点から信頼できます。アクセス許可のアサート、検証不可能なコードの実行、ネイティブ コードの呼び出しなど、危険な操作を実行することはできません。また、SecurityCritical コードを直接呼び出すこともできません。
前述したように、セキュリティ上の理由から、部分的に信頼されたコードはすべて強制的に SecurityTransparent になります。これは、APTCA ライブラリのデフォルトの透明度でもあります。
SecurityCritical: SecurityTransparent とは異なり、SecurityCritical コードは任意の操作を実行できます。宣言を実行したり、
ネイティブ コードを呼び出したり、その他の操作を実行したりできます。透明性フラグによる制限を受けることなく、他のメソッドを呼び出すことができます。
セキュリティクリティカルになることができるのは、完全に信頼されたコードのみです。実際、(APTCA 以外の) 完全に信頼されたコードはデフォルトで SecurityCritical であるため、透過的に部分的に信頼された呼び出し元による呼び出しから保護されます。
SecuritySafeCritical: SecuritySafeCritical コードはブリッジの役割を果たし、透過的なコードが主要なメソッドを呼び出すことができるようにします。 SecuritySafeCritical
コードには SecurityCritical コードと同じ権限がありますが、SecurityTransparent コードから呼び出すことができます。したがって、SecuritySafeCritical コードが基礎となる SecurityCritical メソッドを安全な方法で公開することが非常に重要です (部分的に信頼された悪意のあるコードが SecuritySafeCritical 層を通じてこれらのメソッドを攻撃しようとするのを避けるため)。
SecurityCritical コードと同様に、SecuritySafeCritical コードも完全に信頼される必要があります。
MSDN の説明によると、問題は元の DLL をカプセル化する C# クラス ライブラリ CardReader.Library にあり、コード レベルで透明性属性を設定することで問題を解決できます。
具体的な解決策は次のとおりです:
1. ActiveX コントロール カードの読み取りコードの透過属性を SecuritySafeCritical に設定します。 設定後のコード リストは次のとおりです。ここでのテストに注意してください。コードはシリアル通信とカード読み取りコードを使用します。
2. オリジナルのカードリーダー DLL をカプセル化する透明属性を設定します。M1 カード リーダー ヘルパー クラス MifareOneHelper の透過属性を [SecurityCritical] に設定し、呼び出されるメソッド MifareOneHelper.rf_read の透過属性を [SecurityCritical] に設定します。
シリアル通信ヘルパー クラス SerialInterfaceHelper の透過属性を [SecurityCritical] に設定し、呼び出されるメソッド SerialInterfaceHelper.hex_a の
完全なコードが提供されています。他に 2 つの注意事項があります。クライアントが ActiveX をインストールできない場合は、ActiveX を実行しているアドレスを信頼済みサイトに追加するか、信頼済みサイトのセキュリティ レベルを最小に設定します。 ActiveX オプションに関する信頼サイト。
VS2010 C# を使用した ActiveX コントロールの開発 (パート 2) の詳細、完全なコード パッケージのダウンロード、関連記事については PHP 中国語 Web サイトに注目してください。