[.net] COM 호출 가능한 래퍼 개체 생성 실패를 진단하는 방법?



Answers

어셈블리 바인딩 실패 로깅 기능을 사용할 수 있습니다.이 기능을 활성화해야합니다. 퓨전 로그 뷰어를 사용하여 결과를 볼 수 http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx 클라이언트 시스템에이를 어떻게 얻을지 확실하지 않습니다.

내가 처음 이것을 읽었을 때 가장 먼저 생각한 것은, xp 박스를 얻는 것이 가장 일반적인 것으로 보인다. 이것은 .net 버전 / 비트 현명한 문제이거나 .net dll이 이들 컴퓨터에 존재하지 않는 의존성을 놓친 것입니다.

Question

CoCreateInstance 사용하여 (원시 코드에서) COM 객체를 생성합니다.

const 
   CLASS_GP2010: TGUID = "{DC55D96D-2D44-4697-9165-25D790DD8593}";

hr = CoCreateInstance(CLASS_GP2010, nil, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IUnknown, out unk);

사실 델파이에 있는데 헬퍼 함수를 ​​호출합니다.

CreateComObject(CLASS_GP2010);

대부분의 경우이 함수가 성공합니다. 그러나 동일한 실행 파일에서 동일한 프로세스 에서 CoCreateInstance 호출이 실패하는 경우가 있습니다.

Unspecified error (0x80004005 = E_FAIL)

함수를 다시 호출하면 성공하거나 실패 할 수 있습니다. 운율이나 이유가 없습니다.

내 COM DLL이 아니야.

이것이 내가 작성한 일반적인 COM dll 인 경우 OutputDebugStringDLL_ATTACH 배치하기 시작합니다. 누군가가 DllGetClassObject 를 호출하려고하면 COM이 DLL을 올바르게로드하고 있으며 클래스가 인스턴스화되도록 올바르게 요청하고 있는지 확인합니다. .

불행히도 COM dll이 아닙니다. .NET 어셈블리 DLL입니다. 그리고 COM 서브 시스템 은 단순히dll "로드" 하지 않습니다 . 대신 COM에 mscoree.dll 을로드하라는 메시지가 표시됩니다.

HKEY_CLASSES_ROOT
   CLSID
      {DC55D96D-2D44-4697-9165-25D790DD8593}
         InprocServer32
            @default = mscoree.dll

그리고 mscoree.dll 은 필요한 GetClassObject 함수를 내 보냅니다. 그래서 mscoree.dllE_FAIL 이 아닌 나에게 돌아 오는 것입니다. 실패는 개발 기계에서 결코 발생하지 않지만 고객 기계에서는 끊임없이 실패합니다.

.NET 로깅을 활성화하려면 어떻게합니까?

문제는 mscoree.dllE_FAIL 반환하는 것이기 때문에 (유용하지 않은 것보다) : 문제가 무엇인지 어떻게 말해야합니까?

예를 들어, COM 개체를 많이 사용하는 유일한 사용자 이외에 장애가 발생한 유일한 고객은 Windows XP에있는 것으로 나타납니다. 아마도 .NET Framework의 다른 버전을 동일한 프로세스에로드수없는 .NET Framework (버전 4 이전)의 알려진 버그가 발생했을 수 있습니다 .

그렇게하면 호스트 프로세스에서 예상하는 CLR 버전과 충돌 할 수있는 CLR 버전 종속성이 발생합니다.

이 실패 모드는 COM 래퍼를 사용할 때 MSDN의 기사 에서도 언급되어 있습니다. clrVersion 을 지정할 수있는 옵션 이 있습니다.

다른 버전의 CLR이 이미로드되어 있고 지정된 버전을 나란히 배치하여로드 할 수있는 경우 지정된 버전이로드됩니다. 그렇지 않으면로드 된 CLR이 사용됩니다. 이로 인해로드가 실패 할 수 있습니다.

이것이 Windows XP에서 일시적으로 발생하는로드 실패의 원인이거나 .NET Framework의 이전 버전 인 경우 mscoree.dll 에서 어떻게 알 수 있습니까?

원인이 다른 것이면 .NET에서 어떻게 알 수 있습니까?




Related