COM 및.NET 상호 작용의 간단한 예
4953 단어 .net
<1>.NET 호출 COM
간단하게 하기 위해서 우리는 VB6, 이 곧 개원될 오래된 골동품을 사용하여 간단한 COM을 만들었다.
VB6에서 클래스ComCalc만 있는 ActiveX dll 프로젝트를 새로 만듭니다.cls, 코드는 다음과 같습니다.
주의호환성 설정 및 dll 생성
그리고 vs 2010에 콘솔 프로젝트를 새로 만들었는데 마이크로소프트가 이상해요. VB6의 프로젝트는 프로젝트라고 하는데 vs 2002부터'프로젝트'라고 이름을 바꿨어요.방금 만든 COM에 대한 참조 추가
실행 효과:
아마도 많은 사람들이 이 c# 코드에 대해 궁금해 할 것이다. 이거ComCalc은 언제 생겼습니까?왜 그것을 통해 방법을 호출합니까? 클래스의 대상이 아니라 그것을 통해 방법을 호출합니까?
먼저 방금 COM을 인용한 VS IDE가 우리에게 무엇을 해줬는지 살펴보겠습니다.
위 그림에서 Interop.SimpleComServer.dll은 IDE가 우리를 위해 생성한 '상호작용 프로그램 집합' 이라는 동쪽이고, 이 동쪽은 바로COM과 같다.NET 중간의 다리.
객체 뷰를 통해 볼 수 있는ComCalc은 이 dll에서 생성됩니다.우리는 OLEView를 통해exe가 이 Interop를 살펴보겠습니다.SimpleComServer.dll의 Typelib.
만약 당신이 VB6를 모두 설치했다면, VB 디렉터리에서OLEView를 찾을 수 있습니다.exe, 실행하십시오.만약 당신이 완전히 설치하지 않았다면, 당신은 vs2010 자체 가지고 있는OLEView를 실행할 수 있습니다.에 자리잡다,...
E:\Program Files\Microsoft SDKs\Windows\v7.0A\bin 아래
SimpleComServer를 찾아 두 번 클릭
COM 규칙에 따르면 COM 클라이언트와 COM 클래스가 상호작용하는 유일한 방법은 인터페이스 인용을 사용하는 것이지 대상 인용이 아니다.
C++ 기반의COM 클라이언트를 만들면 특정 인터페이스에 대한 조회 과정을 주목해야 하며, 인터페이스가 더 이상 사용되지 않으면 반드시 풀어야 한다.
VB6에서 만든 클라이언트의 경우 기본 인터페이스가 자동으로 사용됩니다.
이제 C# 코드로 돌아갑니다.
_ComCalc itfComInterface
=
null
;
//
COM
ComCalcClass comObj
=
new
ComCalcClass();
//
COM
itfComInterface
=
(_ComCalc)comObj;
//
COM
Console.WriteLine(
"
COM server says 10 + 832 is {0}
"
,itfComInterface.Add(
10
,
832
));
//
COM
<2>COM 호출.NET
COM 클라이언트와 COM 클래스가 상호작용하는 유일한 방법은 인터페이스 인용이 아니라 대상 인용을 사용하는 것이다.그러나NET에는 인터페이스가 필요하지 않습니다.이때, 우리는 모든 공공 구성원이 기본 인터페이스로 공개되는 것을 확보해야 한다.
다음 세 개의 열거 값 중 하나인 [ClassInterface] 특성을 설정해야 합니다.
AutoDual: 클래스에 대해 이중 클래스 인터페이스를 자동으로 생성하고 COM에 공개하도록 지시합니다.이 인터페이스에 형식 정보를 생성하여 형식 라이브러리에 발표합니다.ClassInterface Attribute에서 기술한 버전 제어의 제한 때문에 Autodual을 사용하지 않는 것을 강력히 권장합니다.
AutoDispatch: 이 클래스는 COM 클라이언트의 사후 바인딩만 지원함을 나타냅니다.요청할 때, 이 종류의 디스핀터face는 자동으로 COM 클라이언트에 공개됩니다.Tlbexp.exe (형식 라이브러리 내보내기 프로그램) 에서 생성된 형식 라이브러리는 디스핀터face의 형식 정보를 포함하지 않아서 클라이언트 캐시 인터페이스의 DISPID를 방지합니다.클라이언트가 인터페이스에 후기에만 귀속될 수 있기 때문에 dispinterface는ClassInterface Attribute에서 기술한 버전 제어 문제가 발생하지 않습니다.ClassInterface Attribute의 기본 설정입니다.
None: 클래스에 클래스 인터페이스를 생성하지 않음을 나타냅니다.인터페이스가 명시적으로 구현되지 않으면 클래스는 IDispatch 인터페이스를 통해서만 후기 바인딩 액세스를 제공할 수 있습니다.ClassInterface Attribute에 권장되는 설정입니다.클래스식으로 이루어진 인터페이스를 통해 기능을 공개하려면 유일한 방법은ClassInterfaceType를 사용하는 것이다.None.
자세한 내용은 MSDN: http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.classinterfacetype.aspx
새 vs 2010 프로젝트를 만듭니다.
주의: 최선의 실천으로서 마땅히.NET 프로그램이 GAC에 배포됩니다.서명하려면 SNK 파일이 필요합니다.GAC에 배포되지 않으면 COM 애플리케이션과 동일한 경로로 복제해야 합니다.
GAC 배포 선택
배포 성공!
내려와서 필요한 COM 라이브러리를 만들어야 합니다.tlbexp를 사용할 수 있습니다.exe 명령, 물론 UI 인터페이스를 통해서도 가능합니다.
이제 OLEView를 사용해볼게요.보기
새 Vb 표준 exe 프로젝트를 만들고 참조를 추가합니다.
원본 다운로드
초청월주: 본고의 판권은 초청월과 블로그원이 공동으로 소유하고 전재는 출처를 밝혀 주십시오.남을 돕는 것은 자조하는 것과 같다! [email protected]
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
AS를 통한 Module 개발1. ModuleLoader 사용 2. IModuleInfo 사용 ASModuleOne 모듈...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.