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

时间:2012-04-30 09:16:49

标签: c# service-reference

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

引发的异常是InvalidOperationException(0x80131509)。

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

  1. 以下代码中使用的服务引用对象名称为ServiceClient
  2. ServiceClient是C#dll
  3. 的私密内容
  4. 尝试在构造函数中创建引用也失败
  5. 从类或构造函数中删除“new”关键字会使代码通过,
  6. 服务已启动并正在运行
  7. 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
    

    为什么会发生这种情况的任何建议?

2 个答案:

答案 0 :(得分:1)

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

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

最好的办法是在代码中创建WCF客户端,而不是使用配置文件。这很简单。你可以在这里看到它是如何完成的:WCF Configuration without a config file

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

  

发生了System.InvalidOperationException   找不到引用合同的默认端点元素   ServiceModel客户端配置部分中的“ServiceReference1.IService1”。   这可能是因为找不到您的应用程序的配置文件,或者   因为没有匹配此合同的端点元素可以在   客户元素。

答案 1 :(得分:0)

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

ServiceClient的构造函数或构造函数中调用的某些代码是否会抛出异常?

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

    [ComVisible(false)]
    public class ServiceClient{}

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

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

中断所有例外

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

开始调试。抛出InvalidOperation异常时,Visual Studio应该会中断,然后您可以检查堆栈跟踪。