먼저 COM 전체 장면에서 매우 익숙해졌습니다.COM 구성 요소에서 InvalidCastException, QueryInterface 호출이 실패했습니다.
저는 현재 개발중인 .net 응용 프로그램에서 PCAnywhere의 Ole 자동화를 사용하려고합니다 (VS 2010, C#). PCA 12.5에는 VS를 통해 참조를 추가하려고 할 때 'E : \ Dev \ PcaOle \ awrem32.tlb'에 대한 참조가 추가되지 않았다는 오류 메시지가 표시되는 몇 가지 tlb 파일이 있습니다. 파일이 액세스 가능하고 올바른 어셈블리 또는 COM 구성 요소인지 확인하십시오. ', 그래서 내가 한 것은 tlbimp.exe를 사용하여 interop 어셈블리를 생성하고 생성 된 DLL을 참조로 가져 와서 아무런 문제가 없습니다. 승인.
Thread pcat = new Thread(delegate()
{
CRemoteDataManagerClass mng = new CRemoteDataManagerClass();
RemoteDataExClass data = null;
data = (RemoteDataExClass)mng.RetrieveObjectEx("temp.chf", (short)2, null);
if (data == null)
data = (RemoteDataExClass)mng.CreateObjectEx("temp.chf");
data.ConnectionType = "TCP/IP";
data.PhoneNumber = host.IP;
data.AutoLoginName = host.Nombre.StartsWith("WS") ? "usrwksvc" : "admonadn";
data.AutoDomain = "dom" + actual.numec.PadLeft(4, '0');
data.WriteProtection = false;
data.WriteObject(null);
AWREM32.Document doc = new AWREM32.Document();
});
pcat.SetApartmentState(ApartmentState.STA);
pcat.Start();
pcat.Join();
이 CRemoteDataManagerClass, RemoteDataExClass 및 AWREM32.Document는 어셈블리 내에서 클래스입니다 : 는 여기에 지금까지 가지고 코드의 비트입니다.
그래서 나는 5 선 다음 말한다 (data = (RemoteDataExClass)mng.RetrieveObjectEx("temp.chf", (short)2, null);
)에 예외가 :
'winawsvr.IRemoteDataManager'유형을 인터페이스 유형 'winawsvr.CRemoteDataManagerClass를'COM 개체를 캐스팅 할 수 없습니다. 다음 오류로 인해 IID '{82A1A806-8BA9-11CF-B95F-00A02412C812}'인터페이스의 COM 구성 요소에서 QueryInterface 호출이 실패했기 때문에이 작업이 실패했습니다. 호환되지 않는 Interfaz (HRESULT 예외 : 0x80004002 (E_NOINTERFACE)).
여기에 무엇이 누락 될 수 있습니까? 아마도 COM 구성 요소가 등록되는 방식과 관련이 있을까요? 이전에 regasm.exe로 등록하려고 시도하기도 전에 CLSID에만 LocalServer32 키가있었습니다. 내가 regasm.exe를 실행 한 후 두 가지를 만들었습니다. InprocHandler32와 InprocServer32입니다. 전과 후에도 같은 예외가 있습니다.
나는 STA 아파트 상태로 설정된 스레드 내에서 호출 코드를 실행해야 할 필요가있는 곳을 읽었습니다. 그래서 나는했다. 아직도 변화 없음.
내가 알아 차린 또 다른 사실은 실패한 클래스가있는 interop 어셈블리에 대해 ildasm.exe를 실행했을 때 IRemoteDataManager 내에서 줄을 확인할 수 있다는 것입니다. .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = (01 00 24 38 32 41 31 41 38 30 36 2D 38 42 41 39 // ..$82A1A806-8BA9 ...
. TLB가있는 IRemoteDataManager에는 GUID가 82A1A806-8BA9-11CF-B95F-00A02412C812
이며이 GUID는 예외에서 언급 한 GUID와 동일합니다. 이 GUID의 처음 두 섹션은 ildasm에서 언급 한 해당 줄에서 찾을 수 있습니다 (나머지는 디스플레이 문제를 해결 한 것 같습니다). 그래서 모든 것이 잘 될 것 같습니다.
CRemoteDataManagerClass 대신 IRemoteDataManager를 구현하는 인터페이스 인 CRemoteDataManager를 사용해 보았지만 동일한 문제가 있습니다. 두 경우 모두 항상 CRemoteDataManagerClass 예외가 항상 언급됩니다. ildasm에서 볼 수 있듯이 CRemoteDataManagerClass는 CRemoteDataManager와 IRemoteDataManager를 모두 구현합니다. QueryInterface가 둘 중 하나에서 완전히 실패했을 수도 있습니다.
잘 모르겠습니다. 나는 분명히 여기 저기에있다.
내가 QueryInterface가 실패한 이유를 알아보기 위해 interop 로깅을 살펴 보았지만, .netcompactframework에서이를 수행하는 방법에 대한 문서를 찾았습니다.