powered by simpleCommunicator - 2.0.46     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Может ли быть сохранен порядок полей/методов в сгенерированном WCF клиентском соде?
7 сообщений из 7, страница 1 из 1
Может ли быть сохранен порядок полей/методов в сгенерированном WCF клиентском соде?
    #38184172
http://stackoverflow.com/questions/9894806/can-the-order-of-fields-methods-in-generated-wcf-code-be-preserved

Человеку так никто и не помог. А ведь у меня та же проблема. Возможно ли такое?

У нас добавишь 1 поле, сделаешь Update Service Reference, и весь файл в изменениях: поля, атрибуты (в т.ч. KnownTypeAttribute), методы в этом сгенерированном файле прыгают как хотят. А хотелось бы, чтобы были всегда в одном порядке.

Иногда, например, знаешь, что на серверной стороне добавил 2 поля, не хочешь лишний раз делать Update Service Reference, и не узнаешь при коммите в SVN, оба ли поля появились в Reference? Или там несвежая версия (на момент, когда было добавлено только одно поле). Изменений слишком много для этого.
...
Рейтинг: 0 / 0
Может ли быть сохранен порядок полей/методов в сгенерированном WCF клиентском соде?
    #38184244
Вот пример картинки в SVN

...
Рейтинг: 0 / 0
Может ли быть сохранен порядок полей/методов в сгенерированном WCF клиентском соде?
    #38185178
МихаилР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поливанов Алексей,

Принципиально, вы можете сделать свой генератор. Стандартными настройками - врятли.
...
Рейтинг: 0 / 0
Может ли быть сохранен порядок полей/методов в сгенерированном WCF клиентском соде?
    #38185475
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МихаилР,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
private ToolExitCodes ExecuteToolMode(ToolMode toolMode, InputModule inputModule)
{
    switch (toolMode)
    {
        case ToolMode.MetadataFromAssembly:
            return this.ExportServiceContracts(inputModule);

        case (ToolMode.MetadataFromAssembly | ToolMode.DisplayHelp):
            goto Label_0076;

        case ToolMode.ProxyGeneration:
            this.ImportServiceContracts(inputModule);
            goto Label_0076;

        case ToolMode.WSMetadataExchange:
            this.ExportDownloadedMetadata(inputModule);
            goto Label_0076;

        case ToolMode.Validate:
            return this.ValidateServices(inputModule);

        case ToolMode.DataContractImport:
            this.ImportDataContracts(inputModule);
            break;

        case ToolMode.DataContractExport:
            this.ExportDataContracts(inputModule);
            break;

        case ToolMode.XmlSerializerGeneration:
            this.GenerateSerializer(inputModule);
            break;
    }
Label_0076:
    return ToolExitCodes.Success;
}

 

 



как понятно, что svcutil это .net приложение.
в reflector там все видно, что и как она делает.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
private void ImportServiceContracts(InputModule inputModule)
{
    ImportModule module = new ImportModule(this.options, inputModule.InputConfiguration, inputModule.MetadataDocuments);
    module.ImportServiceContracts();
    ToolConsole.WriteLine(SR.GetString("GeneratingFiles"));
    new CodeGenOutputModule(this.options, inputModule.MetadataDocuments).Save(module.CodeCompileUnit, module.Configuration, module.ConfigWasGenerated);
}

 



я так понимаю, ты генеришь прокси.
вот кусок который это делает.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
internal void ImportServiceContracts()
{
    ServiceEndpointCollection endpoints;
    IEnumerable<Binding> enumerable;
    IEnumerable<ContractDescription> enumerable2;
    this.ImportMetadata(out endpoints, out enumerable, out enumerable2);
    foreach (ContractDescription description in enumerable2)
    {
        this.contractGenerator.GenerateServiceContractType(description);
    }
    if (this.usingVBCodeProvider)
    {
        PostProcessCode(this.CodeCompileUnit);
    }
    if (this.generateConfig)
    {
        this.GenerateConfig(this.contractGenerator, endpoints, enumerable);
    }
    ToolConsole.WriteConversionErrors(this.contractGenerator.Errors);
}





тут this.ImportMetadata(out endpoints, out enumerable, out enumerable2);
этот кусок кода, сдирает все со службы.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
private void ImportMetadata(out ServiceEndpointCollection endpoints, out IEnumerable<Binding> bindings, out IEnumerable<ContractDescription> contracts)
{
    try
    {
        endpoints = this.wsdlImporter.ImportAllEndpoints();
        bindings = this.wsdlImporter.ImportAllBindings();
        contracts = this.wsdlImporter.ImportAllContracts();
    }
    catch (Exception exception)
    {
        if (Tool.IsFatal(exception))
        {
            throw;
        }
        throw new ToolRuntimeException(SR.GetString("ErrUnableToImportMetadata"), exception);
    }
    ToolConsole.WriteConversionErrors(this.wsdlImporter.Errors);
}


но, методы importall* сидят в стандартной сборке .net
System.ServiceModel.dll файл
namespace System.ServiceModel.Description
метод System.ServiceModel.Description.MetadataImporter.ImportAllContracts() : Collection<ContractDescription>

а сам класс которые делает все
называется WsdlImporter в том же файле.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
public override Collection<ContractDescription> ImportAllContracts()
{
    if (this.isFaulted)
    {
        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString("WsdlImporterIsFaulted")));
    }
    this.EnsureBeforeImportCalled();
    Collection<ContractDescription> collection = new Collection<ContractDescription>();
    foreach (ServiceDescription description in this.wsdlDocuments)
    {
        foreach (PortType type in description.PortTypes)
        {
            if (!this.IsBlackListed(type))
            {
                ContractDescription item = this.ImportWsdlPortType(type, WsdlPortTypeImportOptions.ReuseExistingContracts, ErrorBehavior.DoNotThrowExceptions);
                if (item != null)
                {
                    collection.Add(item);
                }
            }
        }
    }
    return collection;
}

 

 



короче там яма без дна :)
думаю, ты можешь тупо взять код и сделать свой генератор проксей, который будет сортировать тебе все.
в этом методе по идее ты видишь collection, вот его отсортировать и делов-то! :)
...
Рейтинг: 0 / 0
Может ли быть сохранен порядок полей/методов в сгенерированном WCF клиентском соде?
    #38185505
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Может ли быть сохранен порядок полей/методов в сгенерированном WCF клиентском соде?
    #38185525
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://blogs.msdn.com/b/carlosfigueira/archive/2011/10/18/wcf-extensibility-wsdl-import-and-code-generation-extensions.aspx

а тут написано, как сделать плагин для svcutil, который по идее может позволить следить за этой коллекцией.
...
Рейтинг: 0 / 0
Может ли быть сохранен порядок полей/методов в сгенерированном WCF клиентском соде?
    #38185536
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://msdn.microsoft.com/en-us/library/aa717040.aspx
тут тоже как сделать плагин для svcutil , чтобы самому заниматься импортом wsdl из службы.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Может ли быть сохранен порядок полей/методов в сгенерированном WCF клиентском соде?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]