2012-04-30 3 views
2

서비스 참조를 보유하고있는 ComVisible .Net (C#) dll을 만들었습니다. 개체를 만들 때마다 외부 COM 클라이언트 (VBScript)에서 dll에 액세스하려고 할 때 예외가 throw됩니다.dll의 서비스 참조에 새로운 키워드

예외는 InvalidOperationException (0x80131509)입니다.

짧은 조사를 통해 서비스 참조 객체 생성시 실패한 것으로 나타났습니다 ("new"). 아래 코드에서

  1. 서비스 참조 객체 사용되는 이름은 ServiceClient
  2. ServiceClient는 "새로운"키워드를 제거
  3. 실패 생성자에서 참조를 만들려고는 C# DLL을
  4. 에 대한 개인입니다 클래스 또는 생성자 모두 코드 패스를 만드는에서,
  5. 이 서비스는 및 실행

DLL이 코드 :

namespace UIIdentifier.Updater 
{ 
    [ClassInterface(ClassInterfaceType.AutoDispatch)] 
    public class Client 
    { 

     [ComVisible(false)] 
      //<<--This throws the exception -->> 
     private ServiceClient uiSpySrv = new ServiceClient(); 

     [ComVisible(true)] 
     public string hello() 
     { 
      return "hello"; 
     } 
    } 
} 

클라이언트 코드 :

Dim oUpdater 
Set oUpdater = CreateObject("UIIdentifier.Updater.Client") 

MsgBox oUpdater.hello 

이런 일이 발생하는 이유 어떤 제안?

+0

예외는 무엇입니까? –

+0

@JaredKells : InvalidOperationException (ID : 0x80131509) –

+0

메시징 인프라를 설정하기 위해 구성 파일에 액세스하려고합니다 (예 : 적절한 URL 가져 오기). 호출 클라이언트 코드에 구성 파일이 없습니다. –

답변

0

클래스 라이브러리로 C# 코드를 성공적으로 컴파일하고 COM에 등록했습니다. 예제 .vbs 스크립트를 실행하고 메시지 상자에 "hello"텍스트가 나타났습니다

ServiceClient 용 생성자 또는 생성자에서 호출 된 일부 코드가 예외를 throw 할 수 있습니까?

샘플 프로젝트에서 ServiceClass는 빈 클래스였습니다.

 
    [ComVisible(false)] 
    public class ServiceClient{} 

Visual Studio를 사용하여 COM 라이브러리를 디버깅 할 수 있습니다.

  • 엽니 클래스 라이브러리
  • 의 속성은 디버그 탭을 선택하고 시작 작업을 변경 : 시작 외부 프로그램.
  • "c : \ windows \ system32 \ wscript.exe"를 외부 프로그램으로 입력하십시오.
  • vbs 파일의 경로를 명령 줄 인수로 입력하십시오. Visual Studio에서 디버그 메뉴에서 모든 예외

    브레이크는 예외를 선택합니다.

  • 각 예외 유형에 대해 던져진 상자를 선택하십시오.

디버깅을 시작하십시오. Visual Studio는 InvalidOperation 예외가 발생할 때 중단되어야하며 스택 추적을 검사 할 수 있습니다.

+0

문제는 서비스 참조를 사용하고 있습니다. 어떤 종류의 가까운 객체를 사용할 때 예외가 발생하지 않습니다. ServiceClient를 외부 wcf 서비스 참조의 인스턴스로 설정하십시오. –

1

가장 큰 원인은 WCF가 app.config 파일에서 서비스 구성을로드하지 못하기 때문입니다.

라이브러리가 COM 개체로로드되면 app.config 파일이 없습니다.

가장 좋은 방법은 구성 파일을 사용하는 대신 코드로 WCF 클라이언트를 만드는 것입니다. 그것은 아주 간단합니다. 여기에서 어떻게 완료되었는지 확인할 수 있습니다 : WCF Configuration without a config file

app.config 파일에 구성된 WCF 서비스를 사용하여 디버거에서 예제 코드를 실행하면 꽤 예외적 인 것으로 생각되는 다음 예외가 생성됩니다.

System.InvalidOperationException은
기본 끝점 요소를 찾을 수 없습니다 발생한 것을 ServiceModel은 서비스 클라이언트 구성 섹션에서 참조 계약 'ServiceReference1.IService1'. 이 계약서와 일치하는 끝점 요소가 클라이언트 요소 에 없으므로 응용 프로그램에 대해 구성 파일을 찾지 못했기 때문일 수 있습니다.

+0

문제를 해결하는 것 같습니다. 그러나이 개념에는 문제가 있습니다. 하드 코딩 된 값은 서비스 유연성을 해치지 만, 클라이언트는 서비스 참조가 포함 된 서비스 참조가있는 클래스 lib를 참조하는 클라이언트에 서비스 세부 정보가 포함되어 있으므로 클라이언트에 서비스 구현을 강력하게 입력합니다 , 클라이언트는 일을 어떻게 처리할지 신경 쓰지 않아야합니다. –

+0

당신이 무슨 말을하는지 잘 모르겠습니다. 클라이언트의 서비스 구성 또는 사용자가 원하지 않는 서비스 중 하나를 선택하십시오. 그렇지 않으면 그들은 내 대답에 따라 COM DLL 내부에 하드 코딩해야합니다. 클라이언트에 의해 구성되기를 원하면 클라이언트가 구성 할 수있는 COM 개체의 인터페이스를 제공해야합니다. App.config 파일과 매니페스트 파일은 COM 클라이언트에로드 할 수있는 .NET Framework의 일부입니다. –