C\#에서 새로운 인 터 페 이 스 를 사용 할 수 있 습 니까?문제 분석

7369 단어 c#new인터페이스
만약 누군가가 당신 에 게 묻는다 면,C\#에서 new 인 터 페 이 스 를 사용 할 수 있 습 니까?뭐라고 대답 할 거 예요?
ITEst Interface 가 인터페이스 라 고 가정 하면 이런 코드 에 문제 가 있 습 니까?
ITestInterface testInterface = new ITestInterface();
많은 책 에서 물론 문제 가 있 습 니 다.인 터 페 이 스 는 new 를 사용 할 수 없습니다.그리고 위 에 있 는 이 문 구 는 컴 파일 러 의 컴 파일 을 통과 하지 못 할 것 이 라 고 생각 합 니 다.
그러나 모든 일 에는 절대적 인 것 이 없다.C\#이렇게 쓰 는 것 을 허락 하 다 니,당연히 너 는 재 료 를 좀 넣 어야 한다.
VS 2005 에 새 콘 솔 프로그램 CA 2005 를 만 듭 니 다.Microsoft.Office.Interop.Excel 참조 추가
image
image
Program 의 Main 함 수 는 한 마디 만 있 습 니 다.
image
컴 파일 을 통 해 애플 리 케 이 션 의 정 의 를 볼 수 있 습 니 다.
image
애플 리 케 이 션 이 인터페이스 임 이 분명 합 니 다.
여기 서 제 가 뜯 어 보 겠 습 니 다.어떤 사람 이 string 이 클래스 인지 구조 인지 말 하 는 것 을 자주 볼 수 있 습 니 다.string 의 정 의 를 보 세 요.
image
 String 은 class 로 수식 되 기 때문에 string 은 100%클래스 입 니 다.
다시 가 져 오 세 요.애플 리 케 이 션 은 인터페이스 이지 만 우 리 는 new 를 사용 할 수 있 습 니 다. .왜?
역 컴 파일 된 코드 부터 보 세 요.
image  
우리 가 쓴 것 은 new Application 이지 만 컴 파일 러 가 우 리 를 위해 만 든 것 은 new applicationClass()임 을 알 수 있다.
혹시 애플 리 케 이 션 에 특별한 점 이 있 나 요?
자세 한 학우 들 은 애플 리 케 이 션 이 이 두 가지 특성 에 의 해 수식 되 었 다 는 것 을 한눈 에 알 아 차 렸 다.
[CoClass(typeof(ApplicationClass))]
[Guid("000208D5-0000-0000-C000-000000000046")]
CoClass 에 대한 설명 은 msdn 을 볼 수 있 습 니 다.
image  
어떤 사람들 은 msdn 을 좋아 하지 않 고 블 로 그 를 즐겨 보 는 이 유 는 msdn 이 너무 솔직 하지 않 기 때문이다.
제 개인 적 인 이 해 는 CoClass 입 니 다.마치 concrete Class 와 같 습 니 다.
이 기능 은 컴 파일 러 가 애플 리 케 이 션 을 컴 파일 할 때 애플 리 케 이 션 클 라 스 를 사용 하여 이 루어 집 니 다.
위의 첫 번 째 문제 로 돌아 가기:
어떻게 하면 이 코드 를 컴 파일 할 수 있 습 니까?
ITestInterface testInterface = new ITestInterface();
위의 분석 을 통 해 우 리 는 이 특성 을 우리 의 인 터 페 이 스 를 수식 하기 쉽다.
namespace CA2005
{
    [CoClass(typeof(TestClass))]
    [Guid("6C8BF7FE-1F6B-437E-BCC8-6D2FF04E66B3")]
    public interface ITestInterface
    {
        void DoSomething();
    }
    [Guid("68C7CB18-0DEE-4689-845D-741525281C76")]
    public class TestClass : ITestInterface
    {
        public void DoSomething()
        {
            Console.WriteLine("TestClass:DoSomething");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Microsoft.Office.Interop.Excel.Application excelApplication =
                new Microsoft.Office.Interop.Excel.Application();
            ITestInterface testInterface = new ITestInterface();
            testInterface.DoSomething();
        }
    }
}
컴 파일,결 과 는 다음 과 같 습 니 다:
image
인 터 페 이 스 는 ComImportAttribute 가 아 닌 CoClassAttribute 로 표 시 됩 니 다.
image
원래 new 인 터 페 이 스 를 원 하 는 것 은 컴 파일 러 가 COM 에 대한 최적화 와 지원 이 었 다.
위의 애플 리 케 이 션 이 COM 대상 임 이 분명 하기 때문에 new 애플 리 케 이 션 을 사용 할 수 있 습 니 다.
 
ITestApplication 에 ComImportAttribute 기능 추가:
clip_image002
다시 실행 합 니 다.결 과 는 다음 과 같 습 니 다.
image
역 컴 파일 코드 보기:
image
내 가 VS 2005 에 빨간색 글씨 체 를 사용 하 는 이 유 는 VS 2010 으로 만 든 프로그램 이 라면 서로 다른 컴 파일 결 과 를 볼 수 있 기 때문이다.
public static void Main()
{
      Application application1 = (Application) Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("00024500-0000-0000-C000-000000000046")));
      ITestInterface interface1 = new TestClass();
      interface1.DoSomething();
      Console.ReadLine();
}
여기 Type.GetType FromCLSID 의 guid 는 ApplicationClass 의 Guid,즉 CoClass 의 Type Guid 입 니 다.
[ComSourceInterfaces("Microsoft.Office.Interop.Excel.AppEvents")]
    [Guid("00024500-0000-0000-C000-000000000046")]
    [TypeLibType(2)]
    [ClassInterface(0)]
    public class ApplicationClass : _Application, Application, AppEvents_Event
{
}
이 점 은 반드시 주의해 야 한다.
아래층 의 몇몇 학우 들 은 이것 이 무슨 의미 가 있다 고 말 했다.다음은 나의 프로젝트 실례 이자 이 문제 때문에 나 는 이 문 제 를 연구 하 게 되 었 다.
프로젝트 에 C3 리더 기 를 사 용 했 습 니 다.이 리더 기 는 카드 읽 기 인터페이스(C3ReadCard)를 제공 하지만 개발 환경 은 2005 이기 때문에 C3ReadCard c3=new C3ReadCard()를 사용 할 수 없습니다.
이 점 은 매우 이상 하 다.엑셀 은 new 를 사용 할 수 있 지만 C3ReadCard 는 new 를 사용 할 수 없 지만 반 사 를 통 해 실현 류 를 호출 하면 C3ReadCard 의 인 터 페 이 스 를 사용 할 수 있다.
이 문제 의 의 미 는 컴 파일 러 가 new 인터페이스 에서 생 성 된 코드 를 어떻게 처리 하 는 지 알 고 다른 용도 가 있 을 지도 모 르 니 발견 을 기다 리 는 것 이다.

좋은 웹페이지 즐겨찾기