2014-05-22 5 views
0

COM 구성 요소에 get_XXX 및 put_XXX 메서드가 있습니다. 나는 .NET 프로젝트에서 그것을 사용했고 RCW가 생성되었다. 이제 get_XXX 및 set_XXX 메소드가 표시되고 put_XXX 메소드는 표시되지 않습니까? IDL에 자동으로 정의되어 있습니까?COM의 put_XXX 메서드가 .NET의 set_XXX로 변경됩니까?

답변

4

다음은 속성 접근 방법입니다. COM 서버를 사용하는 컴파일러는 클라이언트 프로그램이 속성을 쓸 때 get_Xxx()에 대한 호출을 생성하고 put_Xxx()는 속성을 쓸 때 필요합니다. C#에없는 특별한 함수는 putref_Xxx()입니다.이 함수는 값 대신 명확하게 객체에 액세스하는 데 사용됩니다.

Tlbimp.exe에서 수행하는 일반적인 변환은 일반 C# 속성입니다. 그러나 항상 C 번호는 속성처럼 보일 수있는 작업에 대한 훨씬 더 엄격하다, 작동하지 않습니다

  • 기본 속성, DISPID_VALUE로 주석 년대 일 (DISPID 0) 에 하나의 인자를 취해야합니다 호환 가능. 이 배열은 C# indexer property으로 매핑되며 배열을 인덱싱하는 것과 같습니다.
  • 다른 속성은 인수를 사용할 수 없으며 C#은 인덱서 이외의 인덱싱 된 속성을 지원하지 않습니다.
  • C#에는 putref_Xxx()와 같은 기능이 없으므로 앞의 두 글 머리 기호 때문에 C# 프로그램에서 구문 모호성이 발생할 수 없습니다. C# 팀이 이러한 제한을 적용하기로 결정한 핵심 이유는 언어의 모호성을 크게 싫어했습니다. 는 COM 속성 접근은 다음이 대신 속성의 일반 방법으로 그들을 노출로 후퇴해야한다 호환되지 않는 경우

그래서 Tlbimp.exe를은 이러한 제한을 처리하도록 강요한다. 기본 이름을 사용하면 get_set_ 접두사가 표시됩니다. 후자는 귀하의 질문에 대해 설명하고, 그렇지 않은 경우에는 put_을 선택하지 않았습니다.

주목할만한 점은 C# 버전 4는 이러한 제한 사항 중 일부를 완화하여 대부분 Office 프로그램과의 상호 운용성을 더 쉽게 만들어주는 것입니다. 약간의 C# 버전에서는 꽤 고통 스러웠습니다. 고통을 줄이기 위해 속성 구문을 확장했지만 COM interop에만 적용됩니다. 여전히 이전 버전의 .NET에 머물러 있다면 지금 업데이트하는 것이 좋습니다.

+0

interop 어셈블리 어딘가에서이 변환을 볼 수 있습니까? 사실 interop dll에 대한 ILSpy 디 컴파일 된 코드에서도 set_Xxx가 호출되고 put_Xxx는 표시되지 않습니다. – A9S6

+1

COM 메서드가 런타임에 이름으로 지정되지 않았습니다. COM 서버가 제공하는 인터페이스 디스패치 테이블의 주소 일뿐입니다. 아니, 기계 코드를 보는 것 이상으로는 볼 수 없습니다. –

3

속성 자체는 접두사 (put_ 등)가 있어야하며 이름, getter 메서드, setter 메서드가 있지만 접두사는 없습니다. 형식 라이브러리에서 생성 된 메서드 테이블은 getter와 setter를 구별하기 위해 접두사를받습니다. 접두어 문자열은 이름을 생성 한 사람의 기본 설정에 따라 다릅니다.

은 참조 :

기본적으로

, 낮은 수준의 propget, propput 및 propputref 방법은 get_의 접두사라는 이름의 멤버 함수에 의해 노출됩니다, put_ 및 putref_입니다. 이러한 접두사는 MIDL에서 생성 된 헤더 파일에 사용 된 이름과 호환됩니다.

+0

그래서 .NET RCW는 COM 컨트롤의 put_XXX에 대해 set_XXX를 자동으로 구현합니다. 이것이 어딘가에 기록되어 있습니까? 어떤 링크?ILSpy에서 interop dll을 열었습니다. set_XXX 메서드가 put_XXX를 내부적으로 호출하지만 참조를 찾을 수 없다고 생각했습니다. – A9S6

+0

다른 의미는 아닙니다. .NET RCW 및 COM은 다른 이름으로 같은 것을 참조합니다. 이름이 일치 할 필요는 없습니다. –