Сгенерированный тип WSDL не принимает атрибуты COM - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть сгенерированный 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 версии 4.7.3062.0 для Microsoft .NETFramework Framework 4.7.3062.0 Copyright (C) Microsoft Corporation.Все права защищены.

Типы успешно зарегистрированы. Обработка предупреждений экспортера библиотеки типов 'MyAssembly.FVZServices.FVZServicesClient, MyAssembly'.Предупреждение: экспортер библиотеки типов обнаружил тип, производный от универсального класса и не помеченный как [ClassInterface (ClassInterfaceType.None)].Интерфейсы классов не могут быть выставлены для таких типов.Попробуйте пометить тип с помощью [ClassInterface (ClassInterfaceType.None)] и предоставить явный интерфейс в качестве интерфейса по умолчанию для COM с помощью атрибута ComDefaultInterface.Сборка экспортирована в 'C: \ Users \ MyName \ Documents \ ScanLibrary \ Packet \ MyAssembly.tlb', и библиотека типов была успешно зарегистрирована

Когда я добавляю атрибут [ClassInterface(ClassInterfaceType.None)], как предложено для FVZServicesClientЯ все еще получаю то же сообщение об ошибке в следующий раз, когда я попробую regasm.Я знаю, что сгенерированный код может быть перезаписан в любое время, но я проверил с помощью DotPeek, что атрибут ClassInterface все еще был в скомпилированном коде.

Еще одна вещь, которую я попробовал, состояла в том, чтобы создать частичный класс FVZServicesClient с атрибутом ClassInterface.Я также пометил интерфейс по умолчанию с COMDefaultInterface, как следует из сообщения.Результат был таким же.Добавление атрибута [ComVisible(false)] для FVZServicesClient также не помогло.

Когда на библиотеку ссылаются в VB6, компиляция приводит к ошибке: «Пользовательский тип не определен».

Как я могу исключить FVZServicesClient из интерфейса COM?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Сообщение об ошибке было обманчиво.В FVZServicesClient есть метод, который ожидает, что параметр будет передан по ссылке.

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

Я не передал его по ссылке.Как только я это исправил, сообщение об ошибке исчезло.На данный момент нет атрибута COMVisibility или ClassInterface на FVZServicesClient, и COM в порядке с этим.

0 голосов
/ 26 ноября 2018

Попробуйте добавить атрибут [ComVisible(false)] к class FVZServicesClient.

Я не уверен, как работает ваш процесс генерации кода, но, как отмечено в вопросе, вы можете, по крайней мере, попробовать добавить его вручную и посмотреть,имеет желаемый эффект.

...