2

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

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

簡単な調査の後、サービス参照オブジェクトの作成(「新規」化)で失敗することに気付きました。

  1. 以下のコードで使用されるサービス参照オブジェクトの名前は次のとおりです。ServiceClient
  2. ServiceClientC# dll のプライベートです
  3. コンストラクターで参照を作成しようとしても失敗します
  4. クラスまたはコンストラクターの両方から「new」キーワードを削除すると、コードが通過します。
  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

なぜこれが起こるのか?

4

2 に答える 2

1

最も可能性の高い原因は、WCF が app.config ファイルからサービス構成を読み込めないことです。

ライブラリが COM オブジェクトとして読み込まれると、app.config ファイルは存在しません。

最善の策は、構成ファイルを使用する代わりにコードで WCF クライアントを作成することです。とても簡単です。ここでその方法を確認できます:構成ファイルを使用しない WCF 構成

app.config ファイルで構成された WCF サービスを使用してデバッガーでサンプル コードを実行すると、次の例外が生成されました。

System.InvalidOperationException が発生
しました ServiceModel クライアント構成セクションで、コントラクト 'ServiceReference1.IService1' を参照する既定のエンドポイント要素が見つかりませんでした。これは、アプリケーションの構成ファイルが見つからなかったか、このコントラクトに一致するエンドポイント要素がクライアント要素に見つからなかったためである可能性があります。

于 2012-04-30T11:23:18.623 に答える
0

C# コードをクラス ライブラリとしてコンパイルし、COM に登録しました。サンプルの .vbs スクリプトを実行すると、メッセージ ボックスに "hello" というテキストが表示されました。

ServiceClient のコンストラクターまたはコンストラクターで呼び出されたコードが例外をスローしている可能性はありますか?

私のサンプル プロジェクトでは、ServiceClass は単なる空のクラスでした。

    [ComVisible(偽)]
    パブリック クラス ServiceClient{}

Visual Studio を使用して COM ライブラリをデバッグできます。

  • クラス ライブラリのプロパティを開く
  • [デバッグ] タブを選択し、開始アクションを [外部プログラムの開始] に変更します。
  • 外部プログラムとして「c:\windows\system32\wscript.exe」と入力します。
  • コマンド ライン引数として vbs ファイルへのパスを入力します。

すべての例外で中断

  • Visual Studio のデバッグ メニューで、例外を選択します。
  • 各例外タイプのスローされたボックスにチェックを入れます。

デバッグを開始します。InvalidOperation 例外がスローされると Visual Studio が中断し、スタック トレースを調べることができます。

于 2012-04-30T09:38:12.167 に答える