dll 的服务参考上的新关键字

本文关键字:关键字 参考 服务 dll | 更新日期: 2023-09-27 18:32:36

我创建了包含服务引用的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

有什么建议为什么会这样吗?

dll 的服务参考上的新关键字

最可能的原因是 WCF 无法从 app.config 文件加载服务配置。

将库作为 COM 对象加载时,不存在 app.config 文件。

最好的办法是在代码中创建 WCF 客户端,而不是使用配置文件。这很简单。您可以在此处查看它是如何完成的:没有配置文件的 WCF 配置

使用在 app.config 文件中配置的 WCF 服务在调试器中运行示例代码会生成以下异常,我认为这是不言自明的。

系统
。无效操作发生异常 找不到引用协定的默认终结点元素 "ServiceReference1.IService1"在 ServiceModel 客户端配置部分中。 这可能是因为找不到应用程序的配置文件,或者 因为在 客户端元素。

我已成功将您的 C# 代码编译为类库并将其注册到 COM。我运行了示例 .vbs 脚本,出现一个消息框,其中包含文本"hello">

服务客户端的构造函数或构造函数中调用的某些代码是否会引发异常?

在我的示例项目中,ServiceClass 只是一个空类。

   [ComVisible(false(]    公共类 ServiceClient{}

您可以使用 Visual Studio 调试 COM 库。

  • 打开类库的属性
  • 选择"调试"选项卡,并将启动操作更改为:"启动外部程序"。
  • 输入"c:''windows''system32''wscript.exe"作为外部程序。
  • 输入 vbs 文件的路径作为命令行参数。

中断所有异常

  • 在Visual Studio中的调试菜单下,选择异常。
  • 勾选每种异常类型的抛出框。

开始调试。当引发 InvalidOperation 异常时,Visual Studio 应该会中断,然后你可以检查堆栈跟踪。