Как добавить ссылку веб-сервиса в DLL

Я создаю DLL со ссылкой на веб-сервисы (у меня нет выбора сделать так), но я должен добавить ссылки веб-сервиса на проект, который использует DLL для него для работы.

Пример, у меня есть DLL по имени API.DLL, который называет веб-сервис по имени WebService.svc, который я хочу использовать в проекте под названием WinForm. Во-первых, я должен добавить "Сервисную Ссылку" на WebService.svc в API.DLL. Затем я добавляю ссылочный API.DLL к WinForm, но он не работает, если я также не добавляю сервисную ссылку на WebService.svc в WinForm.

Что я могу сделать для предотвращения того последнего шага?

6
задан dsimard 11 February 2010 в 21:22
поделиться

4 ответа

Конечно, было бы неплохо иметь оператор модуля ... Поскольку нет ни одного, самый простой способ сделать то, что вы хотите, вероятно, использовать библиотеку метаданных в F # PowerPack:

#r "FSharp.PowerPack.Metadata.dll" 
open Microsoft.FSharp.Metadata

// get .NET assembly by filename or other means
let asm = ...

let fasm = FSharpAssembly.FromAssembly asm
let t = fasm.GetEntity("Foo").ReflectionType

К сожалению, это не будет работать с динамическими сборками (например, созданными с помощью F # Interactive). Вы можете сделать что-то подобное с помощью вызовов vanilla System.Reflection , но это больше зависит от хорошего понимания скомпилированной формы, которую принимает модуль.

-121--2192899-

имя модуля не является типом.

Список в List.map и пусть (a: List < int >) = [1; 2; 3] различаются.

Первый List - имя модуля, второй - тип.

-121--2192902-

Ваш первый шаг - доказать себе, что это возможно, а затем адаптировать свой проект.

можно загрузить выполняемое решение здесь .

Я только что прошел через шаги и перечислил свои действия, чтобы добиться желаемых результатов.

    Create a web app project (an thus a solution) named 'ReferencedWebService'
    Add a web service, just leave the default name and implementation
    Add a class library named 'ReferencedWebserviceAPI'
        Add Service Reference
            >Advanced
                >Add Web Reference>Web services in this solution
                    >WebService1
                        >Add reference leaving name as 'localhost'
    Add a console application project named 'ReferencedWebserviceClient'    
    To ReferencedWebserviceClient: 
        Add Reference
            >Projects
                >ReferencedWebserviceAPI
        Add Reference
            >.Net
                >System.Web.Services

    In Program.cs replace Main:

    static void Main(string[] args)
    {
        var svc = new ReferencedWebserviceAPI.localhost.WebService1();
        var result = svc.HelloWorld();
        Console.WriteLine(result);
        Console.ReadLine();
    }


    Set ReferencedWebserviceClient as startup project and run.

    Ok, this is simplest scenario. One issue you will have to deal with is that the default Service URL is hardcoded in the .dll,
    and it is set to a ported address on your dev machine.

    You will want to add a configuration parameter to your client project. The simplest and most portable way is to use an appSetting.

    To ReferencedWebserviceClient:
        Add Item
            >Application Configuration File

    Replace contents of App.Config with this, of course replace the value with the appropriate value on your machine.

    
    
      
        
      
    


        Add Reference
            >.Net
                >System.Configuration

    Now replace Main with this:

    static void Main(string[] args)
    {
        var svc = new ReferencedWebserviceAPI.localhost.WebService1
                      {
                          Url = ConfigurationManager.AppSettings["serviceUrl"]
                      };
        var result = svc.HelloWorld();
        Console.WriteLine(result);
        Console.ReadLine();
    }

Это базовый уровень для встраивания служб в распространяемый файл .dll.

Попробуйте применить эту модель к вашему текущему проекту и узнайте, как это работает для вас.

Если у вас все еще есть проблемы, у вас, безусловно, есть справочный вопрос, и вы должны начать рассматривать его с этой точки зрения.

Надеюсь, что это поможет

6
ответ дан 8 December 2019 в 18:35
поделиться

Это потому, что вам нужна ссылка на службу, чтобы приложение WinForm могло ссылаться на типы, возвращаемые вашей службой?

Если это так, вы могли бы превратите свою DLL-библиотеку API в оболочку для службы и оберните все методы, доступные в службе, в API, и сделайте то же самое для объектов (при условии, что это классы, которые вы создали). Очевидно, вам придется преобразовать все объекты, возвращаемые службой, в объекты в API. Но как только это будет сделано, вам не нужно будет ссылаться на службу в WinForm. (как ни странно, я сам занимаюсь чем-то подобным!).

1
ответ дан 8 December 2019 в 18:35
поделиться

Возможно, вы используете типы, предоставляемые веб-службой, или вам может потребоваться добавить веб-ссылку, чтобы соответствующая информация о подключении была добавлена ​​в файл конфигурации. Приложение winform не будет наследовать или использовать файл конфигурации DLL каким-либо образом, если только вы не придумаете для него какой-то причудливый механизм загрузки. Другими словами, в DLL, когда вы добавляете веб-ссылку, файл конфигурации получает информацию о том, как подключиться к веб-службе, но когда вы затем используете DLL в приложении, вашему приложению эта информация нужна в собственном файле конфигурации, таким образом, вы должны добавить веб-ссылку, чтобы информация была сгенерирована.

Что касается использования типа, указанного в веб-ссылке, я не уверен, может ли это быть проблемой, с которой вы столкнулись. Я сталкивался с подобными вещами в библиотеках DLL. Например, SharpMap.dll объявляет класс SharpMapData , а WrapperOfSharpMap.dll имеет метод под названием ProcessData (SharpMapData blah)

Если я пишу приложение WinForm и добавляю ссылку на WrapperOfSharpMap.dll , Мне также нужно добавить ссылку на SharpMap.dll, потому что для вызова ProcessData мне нужно создать экземпляр SharpMapData для перехода к функции. Другими словами, я использую тип, объявленный в SharpMap.dll, поэтому мне нужна ссылка на него.

Чтобы решить эту проблему, создатель WrapperOfSharpMap.dll должен создать класс WrapperSharpMapData следующим образом:

class WrapperSharpMapData
{
  private SharpMapData hiddenSharpMapData;

  //create proprerties to access data elements using standard CLR types or other wrapper types
}
5
ответ дан 8 December 2019 в 18:35
поделиться

Вы можете попробовать посмотреть на svcutil.exe , который позволяет вам генерировать код прокси на стороне клиента для вашего сервиса через командную строку. Вы сможете взять файл кода, который он создаст, и просто добавить его в ваш проект DLL. Это позволит вам полностью обойти Visual Studio.

1
ответ дан 8 December 2019 в 18:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: