실제로 설정하지 않고 코드만 수정하면 프로그램을 실행한 후 오류 인터페이스는 아래 그림 1과 같습니다.
다음과 같이 예외가 발생합니다:
************** 예외 텍스트 **************
System.MethodAccessException: 보안 투명 메서드 ' Rare.Card.Libary.Controls.
ReadCardControl.btnRead_Click(System.Object, System.EventArgs)'을 통해 'Rare.Card.Libary 메서드를 통해 네이티브 코드를 호출하려고 시도했습니다. .MifareOneHelper.rf_read(Int32, Int32, Byte[ ])'가 실패했습니다. 네이티브 코드를 호출하려면 메서드가 보안에 중요하거나
보안에 중요해야 합니다.
MSDN을 참조하면 예외에 대한 설명은 다음과 같습니다.
Microsoft .NET Framework 4에서는 CLR(공용 언어 런타임) 보안 모델이 많은 변경을 거쳤습니다. 변경 사항 중 하나인 Level2 투명성
(Silverlight의 보안 모델과 매우 유사) 채택은 APTCA(AllowPartiallyTrustedCallers) 라이브러리 작성자에게 영향을 미칠 가능성이 높습니다. SecurityTransparent, SecuritySafeCritical 및 SecurityCritical의 세 가지 투명성 속성이 있습니다.
SecurityTransparent: SecurityTransparent로 표시된 코드는 보안 관점에서 신뢰할 수 있습니다. 권한 주장,
검증할 수 없는 코드 실행, 네이티브 코드 호출 등 위험한 작업은 수행할 수 없습니다. 또한 SecurityCritical 코드를 직접 호출할 수도 없습니다.
위에서 언급했듯이 보안상의 이유로 부분적으로 신뢰할 수 있는 모든 코드는 강제로 SecurityTransparent로 설정됩니다. 이는 APTCA 라이브러리의 기본 투명성이기도 합니다.
SecurityCritical: SecurityTransparent와 달리 SecurityCritical 코드는 원하는 작업을 수행할 수 있습니다. 선언,
네이티브 코드 호출 및 기타 작업을 수행할 수 있습니다. 투명도 플래그에 의해 제한되지 않고 다른 메서드를 호출할 수 있습니다.
완전히 신뢰할 수 있는 코드만 SecurityCritical이 될 수 있습니다. 실제로 APTCA가 아닌 완전히 신뢰할 수 있는 코드는 기본적으로 SecurityCritical이므로 투명한 부분적으로 신뢰할 수 있는 호출자의 호출로부터 보호됩니다.
SecuritySafeCritical: SecuritySafeCritical 코드는 투명한 코드가 주요 메소드를 호출할 수 있도록 하는 브리지 역할을 합니다. SecuritySafeCritical
코드는 SecurityCritical 코드와 동일한 권한을 갖지만 SecurityTransparent 코드로 호출할 수 있습니다. 따라서 SecuritySafeCritical 코드가 기본 SecurityCritical 메서드를 안전한 방식으로 노출하는 것이 매우 중요합니다(SecuritySafeCritical 계층을 통해 이러한 메서드를 공격하려는 부분적으로 신뢰할 수 있는 일부 악성 코드를 방지하기 위해).
SecurityCritical 코드와 마찬가지로 SecuritySafeCritical 코드도 완전히 신뢰할 수 있어야 합니다.
MSDN의 설명에 따르면 문제는 원본 Dll을 캡슐화하는 C# 클래스 라이브러리 CardReader.Library에 있으며 코드 수준에서 투명도 속성을 설정하여 문제를 해결할 수 있습니다.
구체적인 해결 방법은 다음과 같습니다.
1. ActiveX 제어 카드 읽기 코드의 투명 속성을 SecuritySafeCritical로 설정합니다. 설정 후 코드 목록은 다음과 같습니다.[SecuritySafeCritical] /// <summary> /// 读卡 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnRead_Click(object sender, EventArgs e) { int i = 0; byte[] data = new byte[16]; byte[] buff = new byte[32]; for (i = 0; i < 16; i++) data[i] = 0; for (i = 0; i < 32; i++) buff[i] = 0; st = MifareOneHelper.rf_read(icdev, sec * 4 + 1, data); if (st == 0) { SerialInterfaceHelper.hex_a(data, buff, 16); txtCardID.Text = System.Text.Encoding.ASCII.GetString(buff); lblMsg.Text = "读取卡号成功!"; } else lblMsg.Text = "读取卡号失败!"; //test method //if (string.IsNullOrEmpty(txtCardID.Text)) //{ // lblMsg.Text = "读取数据失败!"; //} //else //{ // lblMsg.Text = string.Format("读取数据:{0}!", txtCardID.Text); //} }
2. 원본 카드 리더기 DLL을 캡슐화하는 투명 속성을 설정합니다.
M1 카드 리더 도우미 클래스 MifareOneHelper의 transparent 속성을 [SecurityCritical]로 설정하고, 호출된 MifareOneHelper.rf_read 메서드의
transparent 속성을 [SecurityCritical]로 설정합니다.
직렬 통신 도우미 클래스 SerialInterfaceHelper의 투명 속성을 [SecurityCritical]로 설정하고 호출된 SerialInterfaceHelper.hex_a 메서드의
투명 속성을 [SecurityCritical]로 설정합니다.
완전한 코드가 제공되었습니다. 클라이언트가 ActiveX를 설치하지 못한 경우에는 ActiveX를 실행하는 주소가 신뢰할 수 있는 사이트에 추가됩니다. 사이트가 최소화되거나 ActiveX 관련 사이트 신뢰 옵션을 설정하도록 축소됩니다.
VS2010 C#을 사용하여 ActiveX 컨트롤을 개발하는 방법(2부), 전체 코드 패키지 다운로드에 대한 자세한 내용은 PHP 중국어 웹사이트에서 관련 기사를 확인하세요!