레이블이 .NET 4인 게시물을 표시합니다. 모든 게시물 표시
레이블이 .NET 4인 게시물을 표시합니다. 모든 게시물 표시

2012년 2월 19일 일요일

.NET 4 상속 보안 규칙 문제

.NET 4 는  이전 버전보다 보안이 무척 강화되었네요. 특히 기존 .NET 2.0 이나 .NET 3.5 를 기준으로 컴파일된 에셈블리의 경우 문제가 생기는 경우가 잇습니다. 특히 소스가 있어서 .NET 4 로 컴파일해서 사용하려고 할 때 다음과 같은 예외가 발생할 수 있습니다.

'Inheritance security rules violated while overriding member'

이 문제는 사실 두 군데서 경험했는데, Ext.Net 을 .NET 4 로 컴파일 후 사용하려고 할 때, Microsoft Enterprise Library 5.0 을 .NET 4 에서 사용하려고 할 때 였습니다.

아무리 찾아도 이 문제에 대한 해법은 보이지 않더니, 오늘 우연히 찾았습니다. 결론적으로는 위와 같은 문제가 생기는 경우, 보안 규칙을 .NET 3.5 이하 버전을 기준으로 하도록 강제로 낮추는 것입니다.

실제 Enterprise Library 관련 보안 예외에 대한 정보는 여기를 보세요

AssemblyInfo.cs 에 다음의 코드를 추가하세요.

[assembly: SecurityRules(SecurityRuleSet.Level1)]


이 코드는 보안규칙을 Level1 으로 낮추어서, 보안 규칙 예외를 발생시키지 않도록 하는 것입니다.



보안 관련하여 .NET 4 로 마이그레이션이 안되었던 분들은 위의 보안 규칙을 낮춘 다음에 다시 시도해 보시기 바랍니다.

2012년 2월 15일 수요일

.NET Framework 4.0 의 Named Parameter 기능

하는 짓이 대부분 Data 다루는 일이고, API 만드는 일이라, 많은 양의 인터페이스, 클래스, 메소드 등을 만듭니다.

.NET 3.5 부터인가?  확장 메소드 (Extension Methods) 기능에 인터페이스 + 제너릭을 이용하면, 상당히 편하게 기존 코드를 변형하거나 확장할 수 있어서 좋았습니다.

.NET 4.0 에서 가장 큰 특징은 TPL (Task Parallel Library) 와 Dynamic 입니다만, TPL은 진작에 마스터(?) 했고, Dynamic 은 거의 쓸 일이 없어서 안 쓰고 있었습니다. 거기다가 Named Parameter는 Delphi 시절부터 잘 쓰던 기능인데, C#에서는 이제서야 제공되네요… TPL은 NET 3.5 용이 따로 제공되어, 회사 라이브러리 제작 시에 활용했습니다만, Dynamic 이나 Named Parameter 는 회사 규정 상 .NET 3.5 / .NET 4.0 동시 지원을 하도록 해서, 그림의 떡(?) 이었습니다.

이번에 개인적으로 만드는 라이브러리는 .NET 4.0 이상만을 지원하도록 하면서, Named Parameter 를 사용하기 시작했습니다.

역시 기대대로 정말 편합니다. overloading 줄어들고, interllisense에 기본 값이 나오니, 기존 overloading보다 훨씬 많은 정보를 사용자에게 알려주게 되네요.

특히나 검색용 쿼리를 만들 때, 인자 값을 미리 설정할 수 있어서 좋고, 생성자도 많이 만들 필요 없고^^

protected DocumentReporter() {}
public DocumentReporter(Document document, ActorObject reporter = null)
{
// ...

}


이렇게 하면 document 만 인자로 해서 만들 수 있습니다^^ 


다만 생성자의 경우 기본 생성자인 class A 의 생성자 A() 와 생성자 A(string n=null) 은 사용자 입장에서는 A() 를 호출 하는 것이 A(string n=null) 을 호출 하는 것이므로, A() 를 제거해도 사용자 입장에서는 제대로 작동합니다만, Reflection을 통해 보면, A 수형의 기본 생성자 (인자가 없는 생성자) 가 없다고 나옵니다. 즉 A()와 A(string n=null) 은 겉보기는 같고, 사용자가 사용하기에는 같지만, 수형 자체는 다르다는 점을 주의하셔야 합니다.


뭐 나머지 경우는 크게 문제 될 것 없고, 사용하기도 편합니다. 다만 ValueType에 대해 default 값을 주고 싶은데, 뭘 지정해야 할지 곤란할 때에는, 기존 방식대로 Nullable<T>를 사용하시면 좋습니다.


public QueryOver<Form, Form> BuildQueryOverOfForm(string name = null,
FormKind formKind = FormKind.Unknown,
bool? isEnabled = null,
bool? isVisible = null)



와 같이 bool? 을 사용하면 됩니다.