편집 : 나는 블로그 게시물 로 결과를 작성 했습니다 .
C # 컴파일러는 COM 유형을 다소 마술처럼 처리합니다. 예를 들어,이 문장은 정상적으로 보입니다 ...
Word.Application app = new Word.Application();
... Application
인터페이스 임을 알 때까지 . 인터페이스에서 생성자를 호출 하시겠습니까? 요 익스! 이것은 실제로에 대한 호출 Type.GetTypeFromCLSID()
및 로의 다른 호출로 변환됩니다 Activator.CreateInstance
.
또한 C # 4에서는 ref
매개 변수에 비 참조 인수를 사용할 수 있으며 컴파일러는 로컬 변수를 참조로 전달하여 결과를 무시합니다.
// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");
(예, 많은 인수가 누락되었습니다. 선택적 매개 변수가 좋지 않습니까? :)
컴파일러 동작을 조사하려고하는데 첫 번째 부분을 위조하지 못했습니다. 나는 문제없이 두 번째 부분을 할 수 있습니다.
using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
[ComImport, GuidAttribute("00012345-0000-0000-0000-000000000011")]
public interface Dummy
{
void Foo(ref int x);
}
class Test
{
static void Main()
{
Dummy dummy = null;
dummy.Foo(10);
}
}
다음과 같이 쓸 수 있기를 원합니다.
Dummy dummy = new Dummy();
그러나. 분명히 그것은 실행 시간에 쾅 할 것이지만 괜찮습니다. 방금 실험 중입니다.
연결된 COM PIA ( CompilerGenerated
및 TypeIdentifier
) 에 대해 컴파일러가 추가 한 다른 속성 은 트릭을 수행하지 않는 것 같습니다. 매직 소스는 무엇입니까?
dynamic
... 우리는 정적 / 강력한 타이핑에 너무 익숙하여 COM 외부에서 중요한 이유를 알 수 있습니다.