【发布时间】: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声明更改为Friend或Friend Protected,那么可能不会包含生成的代码在导出的界面中。无法确定发布的少量代码是否允许这样做。不幸的是,C# 中没有与 VB 的Friend匹配的声明。对于这个生成的类(和相关的代码),你能用 VB.net 代替 C# 吗? -
我尝试在 C# 中将 WSDL 生成的代码生成为内部代码。它没有任何区别。没有 VB.net 不是一种选择。