C\#에서 새로운 인 터 페 이 스 를 사용 할 수 있 습 니까?문제 분석
ITEst Interface 가 인터페이스 라 고 가정 하면 이런 코드 에 문제 가 있 습 니까?
ITestInterface testInterface = new ITestInterface();
많은 책 에서 물론 문제 가 있 습 니 다.인 터 페 이 스 는 new 를 사용 할 수 없습니다.그리고 위 에 있 는 이 문 구 는 컴 파일 러 의 컴 파일 을 통과 하지 못 할 것 이 라 고 생각 합 니 다.
그러나 모든 일 에는 절대적 인 것 이 없다.C\#이렇게 쓰 는 것 을 허락 하 다 니,당연히 너 는 재 료 를 좀 넣 어야 한다.
VS 2005 에 새 콘 솔 프로그램 CA 2005 를 만 듭 니 다.Microsoft.Office.Interop.Excel 참조 추가
Program 의 Main 함 수 는 한 마디 만 있 습 니 다.
컴 파일 을 통 해 애플 리 케 이 션 의 정 의 를 볼 수 있 습 니 다.
애플 리 케 이 션 이 인터페이스 임 이 분명 합 니 다.
여기 서 제 가 뜯 어 보 겠 습 니 다.어떤 사람 이 string 이 클래스 인지 구조 인지 말 하 는 것 을 자주 볼 수 있 습 니 다.string 의 정 의 를 보 세 요.
String 은 class 로 수식 되 기 때문에 string 은 100%클래스 입 니 다.
다시 가 져 오 세 요.애플 리 케 이 션 은 인터페이스 이지 만 우 리 는 new 를 사용 할 수 있 습 니 다. .왜?
역 컴 파일 된 코드 부터 보 세 요.
우리 가 쓴 것 은 new Application 이지 만 컴 파일 러 가 우 리 를 위해 만 든 것 은 new applicationClass()임 을 알 수 있다.
혹시 애플 리 케 이 션 에 특별한 점 이 있 나 요?
자세 한 학우 들 은 애플 리 케 이 션 이 이 두 가지 특성 에 의 해 수식 되 었 다 는 것 을 한눈 에 알 아 차 렸 다.
[CoClass(typeof(ApplicationClass))]
[Guid("000208D5-0000-0000-C000-000000000046")]
CoClass 에 대한 설명 은 msdn 을 볼 수 있 습 니 다.
어떤 사람들 은 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();
}
}
}
컴 파일,결 과 는 다음 과 같 습 니 다:
인 터 페 이 스 는 ComImportAttribute 가 아 닌 CoClassAttribute 로 표 시 됩 니 다.
원래 new 인 터 페 이 스 를 원 하 는 것 은 컴 파일 러 가 COM 에 대한 최적화 와 지원 이 었 다.
위의 애플 리 케 이 션 이 COM 대상 임 이 분명 하기 때문에 new 애플 리 케 이 션 을 사용 할 수 있 습 니 다.
ITestApplication 에 ComImportAttribute 기능 추가:
다시 실행 합 니 다.결 과 는 다음 과 같 습 니 다.
역 컴 파일 코드 보기:
내 가 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 인터페이스 에서 생 성 된 코드 를 어떻게 처리 하 는 지 알 고 다른 용도 가 있 을 지도 모 르 니 발견 을 기다 리 는 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.