2012-09-07 1 views
8

는 좀 VB6/COM + 코드를 변환 찾고 있어요에 C#/COM VB6 또는 VB.NET에서 내가 가진 그러나 +C# CreateObject가 VB.NET보다 훨씬 왜 장황합니까?

: 나는 다음을 수행해야처럼

C#에서
Dim objAdmin 
objAdmin = Server.CreateObject("AppAdmin.GUI") 
objAdmin.ShowPortal() 

보인다 :

object objAdmin = null; 
System.Type objAdminType = System.Type.GetTypeFromProgID("AppAdmin.GUI"); 
m_objAdmin = System.Activator.CreateInstance(objAdminType); 
objAdminType.InvokeMember("ShowPortal", System.Reflection.BindingFlags.InvokeMethod, null, objAdmin, null); 

InvokeMember 함수를 사용하지 않고도 함수를 직접 호출 할 수있는 방법이 있습니까?

+4

짧은 답변 : C#을하지 동안 VB가 COM 객체를 소비하는 처음부터 설계 되었기 때문에. – phoog

답변

11

InvokeMember에 기능을 사용하고 단지 함수를 직접 호출 할 필요가 없습니다하는 C# .NET을 얻기의 방법이 있나요 사용할 수 있습니까?

, dynamic typing와 C# 4 등 :

dynamic admin = Activator.CreateInstance(Type.GetTypeFromProgID("AppAdmin.GUI")); 
admin.ShowPortal(); 

그것은 여전히 ​​CreateObject 부분에서 더 자세한하지만 당신이 원하는 경우에 당신이 항상 메서드 호출에 그를 마무리 할 수있다. ( 내가 잘 모르는 것 같아요 기존 통화가있을 수 있습니다, 또는 당신이이 경우에 호출 어떤 VB 발견을 시도 할 수 있습니다 -. 내가 Server.CreateObject의 세부 사항을 모르는) 동적 타이핑이라고

보다 부자 인 경우에만을 사용하면 반사가 더 간단 해지지 만 확실히 그렇습니다. 그 뒤에서도 정적 바인딩만큼 빠른 것은 아니지만 거의 확실하게는 입니다.입니다.

6

예, 당신은 dynamic 키워드

dynamic objAdmin = System.Activator.CreateInstance(objAdminType); 
objAdmin.ShowPortal(); 
-1

당신이 실제 클래스 유형에 액세스 할 수있는 경우는 다음과 같이, 당신이 그것을 할 수 있습니다

AppAdminClass m_objAdmin = (AppAdminClass)System.Activator.CreateInstance(typeof(AppAdminClass)); 
m_objAdmin.ShowPortal(); 
관련 문제