2013-03-28 7 views
19

MSDN은 this article about [ComVisible] attribute입니다. 나는 한 세트가 [ComVisible(true)] 일 때 무슨 일이 일어나는 지 알지 못합니다.[ComVisible] 기본 및 공용 클래스 COM 노출은 어떻게됩니까?

MSDN은

기본값은 관리되는 형식은 COM에 볼 수 있음을 나타냅니다 사실 말합니다. 이 특성은 공용 관리 어셈블리 을 만들 필요가 없습니다.유형이 표시됩니다.; COM에 기본적으로 표시됩니다. 공용 유형 만 볼 수 있습니다.

따라서 공개 유형은 기본적으로 COM에서 볼 수 있습니다. 그러나 그들은 또한 [ComVisible(true)]으로 공개 형식 만 표시 할 수 있다고 말합니다.. 그것은 의미가 없습니다 : 공개 형식이 기본적으로 표시되면 [ComVisible(true)]을 설정하면 공개 형식을 어떻게 볼 수 있습니까? 이미 눈에 보이면 어떻게 더 눈에 잘 듭니까?

아마 내 이해가 올바르지 않습니다. 위의 진술에 빛을 비추는 사람이 있다면 고맙겠습니다.

+5

한 가지 혼란스러운 측면은 기본 Visual Studio 클래스 라이브러리 템플릿이 AssemblyInfo.cs에 [assembly : ComVisible (false)] 특성을 추가한다는 것입니다. 그러면 프로젝트의 모든 유형에 대한 '기본값'이 false로 설정됩니다. 프로젝트 속성에 대한 어셈블리 정보의 '어셈블리 COM- 표시'플래그가 설정합니다. – Govert

+0

여기에 트릭이 있습니다. ComVisible의 기본값은 아무나 설정하지 않으면 true이지만 Visual Studio는이 값을 false로 설정합니다. 즉, 어셈블리를 수동으로 켜기 전까지는 어셈블리가 ComVisible이되지 않습니다. 그러나 VS2008 이전에는이 ​​속성이 기본적으로 true로 설정되었습니다. – Johnny

답변

16

공용 형식이 기본적으로 표시 될 때 ComVisible 특성을 true로 설정하면 [ComVisible (true)] 공용 형식을 어떻게 볼 수 있습니까?

ComVisibleAttribute의 기본값이 true이기 때문에 기본적으로 표시됩니다. 속성을 명시 적으로 true로 설정해도 아무런 변화가 없으므로 의도를 분명히 알 수 있습니다.

기본값은 사실이며, 관리 유형은 COM 볼 수 있음을 나타냅니다 : 그것은 당신이 발견 the documentation의 첫 번째 라인이다. 이 특성은 공용 관리되는 어셈블리 및 형식을 표시하는 데 필요하지 않습니다. COM에 기본적으로 표시됩니다. 공개 유형 만 표시 할 수 있습니다. 그렇지 않은 경우 내부 또는 보호 된 형식을 COM에 표시하거나 보이지 않는 형식의 멤버를 표시 할 수 없도록 특성을 사용할 수 없습니다.

기본적으로 컴파일러가 기본적으로 코드에 [ComVisibleAttribute(true)]을 추가하는 것처럼 생각할 수 있습니다.

이 속성을 설정해야하는 유일한 이유는 입니다. 공용 유형이 COM으로 표시되지 않도록합니다 (이 경우 false로 설정 함). 기본값은 이미 가시성을 보장합니다.

분명히 비공개 유형 (예 : 비공개 및 보호)은 COM에 표시되거나 표시되지 않습니다. 이 속성은 이러한 액세스 가능성이있는 유형에는 영향을주지 않습니다.

+2

정확히 일치하지는 않습니다. 예를 들어 어셈블리 수준에서 ComVisible을 false로 설정하면 클래스 안의 어딘가에있는 "true"세트가 재정의합니다. – Joezer

18

트릭은이 특성을 어셈블리 수준 (AssemblyInfo.cs)에 추가 할 수도 있다는 것입니다. [assembly: ComVisible(true)]을 지정하면 (또는 어셈블리 수준에서 지정하지 않아도 기본적으로 동일한 효과가 적용됨) 모든 공용 클래스와 인터페이스 및 공용 메서드가 기본적으로 COM으로 표시됩니다.

어셈블리 수준에서 [assembly: ComVisible(false)]을 설정하면 모든 공용 엔터티는 기본적으로 [ComVisible(false)]이있는 것처럼 동일한 효과를 갖기 때문에 해당 클래스/인터페이스/메서드를 COM 표시로 만 표시 할 수 있습니다 [ComVisible(true)])이 필요합니다.

공공 단체가 많을 때 here으로 너무 많이 노출시키지 않아야합니다. 이 메커니즘이 없다면 노출시키지 않으려는 각 클래스/인터페이스/메소드에 [ComVisible(false)]을 설정해야합니다. [assembly: ComVisible(false)]을 사용하면 필요한 자료 만 공개 할 수 있습니다.

public 엔티티 만 COM에 노출 될 수 있습니다 (기본 또는 명시 적이어야 함). 더 엄격한 가시성을 가진 엔티티는 COM에 노출 될 수 없습니다.