2012-04-30 5 views
2

サービス参照を保持するComVisible .Net(C#)dllを作成しました。 外部COMクライアント(VBScript)からdllにアクセスしようとすると、オブジェクトを作成するたびに例外がスローされます。dllのサービスリファレンスの新しいキーワード

スローされた例外はInvalidOperationException(0x80131509)です。

短い調査の後、私はそれがサービス参照オブジェクトの作成に失敗したことに気付きました(「新しい」)。

  1. 以下のコードに名前を使用されるサービス参照オブジェクトがコンストラクタで参照を作成しようとすると、C#のDLLの
  2. プライベートServiceClient
  3. ServiceClientですまた、「新しい」キーワードを削除
  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のコンストラクタまたはコンストラクタで呼び出されたコードが例外をスローすることはできますか?

私のサンプルプロジェクトでは、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オブジェクトを構成できるようにするCOMオブジェクトのインターフェイスを提供する必要があります。 App.configファイルとマニフェストファイルは、COMクライアントにロードする方法がない.NETフレームワークの一部です。 –

関連する問題