C# 코딩: Unmanaged Code Convention
P/Invoke 혹은 COM Interop을 통해 Unmanaged Code를 사용하는 경우, 다음과 같은 Naming Convention을 사용한다. Native API들은 별도의 클래스에 정의하며, 다음과 같은 3가지 카테고리로 구분한다: SafeNativeMethods, NativeMethods, UnsafeNativeMethods.
일반적으로 Unmanaged Code 클래스들은 별도의 어셈블리에 두는 것을 권장한다.
일반적으로 Unmanaged Code 클래스들은 별도의 어셈블리에 두는 것을 권장한다.
C# 코딩: SafeNativeMethods
Security 문제가 없는 Native API 함수들은 SafeNativeMethods 클래스 안에 둔다. SafeNativeMethods는 Security Threat이 없는 코드로 인정된 API들이므로 보통 SuppressUnmanagedCodeSecurity attribute를 지정한다.
Managed Code에서 P/Invoke나 COM Interop을 통해 Unmanaged Code를 호출할 때는 언제나 런타임시 UnmanagedCode 실행 권한을 체크하게 된다. 하지만, SuppressUnmanagedCodeSecurity attribute를 지정하게 되면, 런타임시 이러한 권한 체크를 생략하게 되어 상당한 성능향상을 가져올 수 있다. 따라서, 안전한 API를 호출하는 경우 일반적으로 이 attribute를 지정하게 된다.
Managed Code에서 P/Invoke나 COM Interop을 통해 Unmanaged Code를 호출할 때는 언제나 런타임시 UnmanagedCode 실행 권한을 체크하게 된다. 하지만, SuppressUnmanagedCodeSecurity attribute를 지정하게 되면, 런타임시 이러한 권한 체크를 생략하게 되어 상당한 성능향상을 가져올 수 있다. 따라서, 안전한 API를 호출하는 경우 일반적으로 이 attribute를 지정하게 된다.
예제
// SafeNativeMethods
[SuppressUnmanagedCodeSecurity]
class SafeNativeMethods
{
[DllImport("user32")]
internal static extern void MessageBox(string text);
}
[SuppressUnmanagedCodeSecurity]
class SafeNativeMethods
{
[DllImport("user32")]
internal static extern void MessageBox(string text);
}
C# 코딩: NativeMethods
Security 문제가 있을 수 있는 Native API 함수들로서 UnmanagedCode 권한을 실행 시마다 체크하도록 할 경우, 그 API들은 NativeMethods 클래스 안에 둔다. 이 NativeMethods 클래스는 SuppressUnmanagedCodeSecurity 을 지정하지 않는다.
예제
// NativeMethods
class NativeMethods
{
[DllImport("user32")]
internal static extern void FormatDrive(string driveLetter);
}
class NativeMethods
{
[DllImport("user32")]
internal static extern void FormatDrive(string driveLetter);
}
C# 코딩: UnsafeNativeMethods
Security 문제가 발생할 가능성이 있지만 UnmanagedCode 권한을 런타임시 체크하지 않는 API들은 UnsafeNativeMethods 클래스 안에 둔다. 이 UnsafeNativeMethods 클래스는 UnmanagedCode 권한을 체크하지 않으므로 SuppressUnmanagedCodeSecurity 을 지정한다.
이 클래스의 메서드는 보안 위험이 높기 때문에, 사용시 항상 Full Security Review를 진행할 필요가 있으며, 개발팀 혹은 보안팀이 코드를 특별히 점검해야 한다.
이 클래스의 메서드는 보안 위험이 높기 때문에, 사용시 항상 Full Security Review를 진행할 필요가 있으며, 개발팀 혹은 보안팀이 코드를 특별히 점검해야 한다.
예제
// UnsafeNativeMethods
[SuppressUnmanagedCodeSecurity]
class UnsafeNativeMethods
{
[DllImport("user32")]
internal static extern void CreateFile(string fileName);
}
[SuppressUnmanagedCodeSecurity]
class UnsafeNativeMethods
{
[DllImport("user32")]
internal static extern void CreateFile(string fileName);
}