2

我创建了包含服务引用的 ComVisible .Net (C#) dll。尝试从外部 COM 客户端 (VBScript) 访问 dll 时,每当我创建对象时都会引发异常。

抛出的异常是 InvalidOperationException (0x80131509)。

经过短暂的调查,我注意到它在创建服务引用对象时失败(“新建”它)。

  1. 下面代码中使用的服务引用对象名称为ServiceClient
  2. ServiceClient对于 C# 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 回答