【问题标题】:WSDL generated type does not take COM attributesWSDL 生成的类型不采用 COM 属性
【发布时间】:2019-04-22 14:50:31
【问题描述】:

我有一个 WSDL 生成的类

 [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    public partial class FVZServicesClient : System.ServiceModel.ClientBase<FVZScanningDocumentInfo.FVZServices.FVZServices>, FVZScanningDocumentInfo.FVZServices.FVZServices {
...
}

我需要提供一个在 VB6 中使用的库。我使用一个恰好使用上述类的 COM 接口。

当我向

注册程序集时
regasm MyAssembly.dll /tlb:MyAssembly.tlb

我收到错误消息

Microsoft .NET Framework 程序集注册实用程序版本 Microsoft .NET Framework 版本 4.7.3062.0 的 4.7.3062.0 版权所有 (C) Microsoft Corporation。保留所有权利。

类型注册成功类型库导出器警告处理 'MyAssembly.FVZServices.FVZServicesClient,MyAssembly'。警告:类型 库导出器遇到了从泛型类派生的类型 并且未标记为 [ClassInterface(ClassInterfaceType.None)]。班级 不能为此类类型公开接口。考虑标记类型 使用 [ClassInterface(ClassInterfaceType.None)] 并暴露一个 显式接口作为 COM 的默认接口,使用 ComDefaultInterface 属性。装配出口到 'C:\Users\MyName\Documents\ScanLibrary\Packet\MyAssembly.tlb',以及 类型库注册成功

当我按照 FVZServicesClient 的建议添加属性 [ClassInterface(ClassInterfaceType.None)] 时,下次尝试 regasm 时仍然会收到相同的错误消息。我知道生成的代码可以随时被覆盖,但我用 DotPeek 验证了 ClassInterface-attribute 仍然在编译的代码中。

我尝试的另一件事是创建具有 ClassInterface 属性的 FVZServicesClient 部分类。正如消息所示,我还用 COMDefaultInterface 标记了默认接口。结果是一样的。为 FVZServicesClient 添加属性 [ComVisible(false)] 也无济于事。

在VB6中引用该库时,编译会报错:“User-defined type not defined”。

如何从 COM 接口中排除 FVZServicesClient?

【问题讨论】:

  • 如果您的 WSDL 生成的代码是在 VB.net 而不是 C# 中,您可以尝试将 Public 声明更改为 FriendFriend Protected,那么可能不会包含生成的代码在导出的界面中。无法确定发布的少量代码是否允许这样做。不幸的是,C# 中没有与 VB 的Friend 匹配的声明。对于这个生成的类(和相关的代码),你能用 VB.net 代替 C# 吗?
  • 我尝试在 C# 中将 WSDL 生成的代码生成为内部代码。它没有任何区别。没有 VB.net 不是一种选择。

标签: c# com vb6 wsdl


【解决方案1】:

尝试将属性[ComVisible(false)] 添加到class FVZServicesClient

我不确定您的代码生成过程是如何工作的,但正如问题中所述,您至少可以尝试手动添加它并查看它是否具有预期的效果。

【讨论】:

  • 在我发布问题之前我已经尝试过了。没什么区别。
【解决方案2】:

错误消息具有欺骗性。在 FVZServicesClient 中有一个方法需要通过引用传递参数。

public ScanBatchItemType[] CheckBatch(ref ScanBatchItemType[] scanBatchItemTypes)

我没有通过参考。一旦我纠正了这一点,错误消息就消失了。目前 FVZServicesClient 上没有 COMVisibility 或 ClassInterface 属性,COM 可以。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    相关资源
    最近更新 更多