2011-03-02 5 views
1

C# 응용 프로그램에서 inproc COM 서버 구성 요소로 COM interop에 문제가 있습니다.디버거에서만 작동하는 C#/COM interop

나는이 문제를 간단한 C# 테스트 프로그램으로 줄였습니다. 서버 구성 요소의 interop 클래스를 인스턴스화하고 인스턴스의 문자열 속성 값을 설정 한 다음 다른 문자열 속성을 설정합니다. 나는 마샬링과 함께 특별한 일을하지 않을 것이다. COM 구성 요소에 대한 참조를 추가 할 때 생성 된 interop 클래스를 사용하면됩니다. 뭔가 같은 :

using MyLib; // Interop assy 
// ... 
MyComp comp = new MyComp(); 
comp.Prop1 = "abc"; 
comp.Prop2 = "xyz"; 

성과 : 다음 VS 외부 테스트 프로그램을 실행하면 두 번째 속성이 설정되어있는 경우

  • 가, 내가 지속적으로 0x80010105의 HRESULT로 (RPC_E_SERVERFAULT을)를 COMException를 얻을 수 .

  • Visual Studio 2005에서 테스트 프로그램을 실행하면 일관되게 올바르게 작동합니다.

내가 관리되지 않는 C에 해당하는 코드 ++ (NO ATL, 그냥 일반 인터페이스 포인터)를 쓴이와 VS.에서 모두 제대로 작동

내 질문 : 내가보고있는 것을 설명하는 디버거 내부에서 실행할 때 interop가 발생하는 환경과 다른 점은 무엇입니까? 나는 E_RPC_SERVERFAULT이 interop marshaller에 의해 생성되고 있다고 가정하지만 디버거에서만 왜 그런가? 이 작업을 진행하는 방법에 대한 제안이 있으십니까?

[내 질문은 디버거에서보고있는 다른 동작에 관한 것이므로 com 구성 요소에 대해서는 많이 언급하지 않았습니다. com 구성 요소는 잘 테스트되었으며 7 년 이상 (서버 환경에서 하루에 수천 건의 호출) 프로덕션 환경에서 사용되었으므로 상당히 확신합니다. 그것의 32 비트 dll. 소스가 있지만 현재 적절한 빌드 환경이 없습니다. 비록 내가 그랬다 할지라도, 관리 코드에서 어떻게 디버깅 할 지 모르겠습니다. 이 가능]

UPDATE

아직 솔루션,하지만 좀 더 관찰 : 나는, 또한 UAC로 관리자 권한으로 응용 프로그램을 실행하려고

  1. 가 꺼져. 같은 결과.
  2. 오류가 발생하기 전에 프로세스에 연결을 시도했지만 출력 창에 구조적 예외가 표시되지 않습니다.
  3. 테스트 응용 프로그램의 주 스레드에 대한 아파트 모델을 STA 및 MTA로 명시 적으로 설정하려고했지만 차이점이 없습니다. COM 구성 요소는 스레드 스레드입니다.
  4. Win2003 시스템과 다른 Win7 프로 시스템에서 관리되는 테스트 응용 프로그램 (Visual Studio 외부)을 실행 해 보았습니다. 그것은 둘 다 올바르게 작동했습니다.

마지막 항목은 내 컴퓨터 문제를 나타내지 만 무엇이 확실하지 않습니다.

[환경은 Visual Studio 2005 Pro와 함께 Win7 Pro 32 비트에서 실행되는 Framework 2.0입니다.]

+0

우연히 관리자 권한으로 Visual Studio를 실행합니까? UAC/사용 권한 문제 일 수 있습니다. – BrokenGlass

+0

out-of-process * COM 서버와 관련이있는 오류입니다. 그것은 설명 할 여지가 거의 없습니다. 디버거가없는 패들도 없습니다. 시작한 후에 디버거를 연결하십시오. –

+0

@BrokenGlass 좋은 생각. 나는 관리자로서 VS2005를 실행 중이다. 좋지 않아, 나도 알아,하지만 나는 Win7에있어. 지금 집에 있고 vpn에서 내 개발자 상자가 다운 된 것 같습니다. 그래서 아침에 관리자 명령 창에서 테스트를 실행 해 보겠습니다. 감사! –

답변

1

AnyCPU 빌드를 실행할 가능성이 있으며 Visual Studio에서 어셈블리를 32 비트로로드하지만 VS 외부에서 프로그램을 실행하면 x64로 실행되므로 32 비트 COM을로드 할 수 없습니다 dll?

+0

제안 해 주셔서 감사합니다. 64 비트 컴퓨터에서 32 비트 창을 실행 중입니다. AnyCPU에서 x86으로 목표를 변경했지만 아무런 차이가 없었습니다. –

0

동일한 유형의 문제가 있습니다. 32 비트를 할 .NET 응용 프로그램을 강제하고 (스레드)

[STAThread] 
    public static int Main(string [] args) 

또는을 내 경우에는

thread = new Thread(DoWorkUsingCOM); 
    thread.SetApartmentState(ApartmentState.STA); 
    thread.Start(); 

문제를 해결했다.