2010-02-11 12 views
6

tworzę DLL z uwzględnieniem usług internetowych (nie mam wyboru, aby to zrobić), ale muszę dodać referencje usług internetowych do projektu, który używa biblioteka DLL do działania.Jak dodać odwołanie usług internetowych w DLL

przykład mam DLL o nazwie API.DLL który wywołuje usługę internetową o nazwie WebService.svc że chcę użyć w projekcie o nazwie WinForm. Najpierw muszę dodać "Service Reference" do WebService.svc w API.DLL. Następnie dodaję odniesienie API.DLL do WinForm, ale nie działa, chyba że dodam także odwołanie do usługi WebService.svc w WinForm.

Co mogę zrobić, aby uniknąć tego ostatniego kroku?

+1

Nie powinieneś dodawać odwołania do usługi do WinForm ... jaki jest błąd, który widzisz? –

+0

System.InvalidOperationException Moja .NET jest po francusku (... westchnienie ...), ale mówi coś w stylu "Nie można znaleźć odwołania do usługi". – dsimard

Odpowiedz

6

Pierwszym krokiem jest udowodnienie sobie, że jest to możliwe, a następnie dostosowanie projektu.

można pobrać działające rozwiązanie here.

Właśnie przeszedł schodach i wymienił moje działania, aby produkować pożądane rezultaty.

 
    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(); 
    } 

Jest to linia bazowa usług osadzania w rozpowszechnianym pliku .dll.

Spróbuj zastosować ten model do bieżącego projektu i sprawdź, jak to działa.

Jeśli nadal masz problemy, zdecydowanie masz problem z odniesieniem i powinieneś zacząć je przeglądać z tej perspektywy.

Mam nadzieję, że to pomoże

1

Czy to dlatego, że trzeba odniesienie usług tak, że aplikacja WinForm można odwołać typów zwracanych przez usługę?

Jeśli tak jest, możesz zamienić bibliotekę DLL API w wrapper dla usługi i zawrzeć wszystkie metody dostępne w usłudze w interfejsie API i zrobić to samo dla obiektów (zakładając, że są to klauzule, które masz stworzony). Oczywiście musisz przekonwertować wszystkie obiekty, które usługa zwraca do obiektów w interfejsie API. Ale gdy już to zrobisz, nie powinieneś odwoływać się do usługi w WinForm. (zabawnie, jestem w trakcie robienia czegoś podobnego!).

+0

W rzeczywistości mój interfejs API.dll nie zwraca bezpośrednio z usługi internetowej żadnego typu, aby uniknąć tego błędu. To tak, jak DLL używa referencji usługowych z projektu głównego, a nie z siebie. – dsimard

+0

Cóż, jestem zdezorientowany! Co się stanie, jeśli utworzysz nowy projekt i odniesiesz do pliku API.dll? Czy otrzymujesz ten sam błąd? –

+0

Tak, ten błąd występuje, jeśli nie dodaję również odniesień do usługi sieciowej. Myślę, że dzieje się tak dlatego, że wszystkie generowane automatycznie klasy nie podążają za biblioteką DLL. – dsimard

5

Można używać typów odsłonięte przez usługę internetową, lub może się okazać, że masz dodać odniesienie internetową tak, aby odpowiednie informacje połączenie zostanie dodane do pliku konfiguracyjnego. Aplikacja WinForm nie odziedziczy ani nie użyje pliku konfiguracyjnego DLL w żaden sposób, o ile nie przygotujesz dla niego jakiegoś fantazyjnego mechanizmu ładującego. Innymi słowy, w DLL po dodaniu odwołania do strony internetowej, jego plik konfiguracyjny dostaje informacje o tym, jak połączyć się z usługą sieciową, ale kiedy używasz DLL w aplikacji, twoja aplikacja potrzebuje tych informacji w swoim własnym pliku konfiguracyjnym, w związku z tym należy dodać odniesienie do strony internetowej, aby wygenerować informacje.

W odniesieniu do korzystania typ odsłoniętą przez odniesienie internetowej, nie jestem pewien, czy to może być problemem, gdy występują. Napotkałem tego rodzaju rzeczy w bibliotekach DLL. Na przykład, SharpMap.dll deklaruje klasę SharpMapData i WrapperOfSharpMap.dll ma metodę zwaną ProcessData(SharpMapData blah)

Gdybym napisać aplikację WinForm i dodać odwołanie do WrapperOfSharpMap.dll, mam również dodać odwołanie do SharpMap.dll ponieważ aby wywołać ProcessData muszę utworzyć instancję SharpMapData, aby przekazać tę funkcję. Innymi słowy, używam typu zadeklarowanego w SharpMap.dll, dlatego potrzebuję odniesienia do niego.

Aby rozwiązać ten problem, twórca WrapperOfSharpMap.dll należy utworzyć klasę WrapperSharpMapData tak:

class WrapperSharpMapData 
{ 
    private SharpMapData hiddenSharpMapData; 

    //create proprerties to access data elements using standard CLR types or other wrapper types 
} 
+0

Myślę, że problem jest tak naprawdę, ponieważ muszę odwołać się do usługi sieciowej w WinForm, ale nie chcę tego kroku. Chciałbym, aby programista odwołał się do pliku .DLL i aby usługa internetowa była odwoływana automatycznie. Jak mogę to zrobić? – dsimard

+0

@dan, nie, nie. Coś jeszcze jest nie tak. –

+0

@dan W jaki sposób WinForm uzyskałby informacje konfiguracyjne do połączenia z usługą sieciową bez dodawania odwołania do usługi sieciowej? Sprawdź, co dzieje się z plikiem konfiguracyjnym, gdy dodajesz odniesienie do strony internetowej. Ustawienia konfiguracji z bibliotek DLL w żaden sposób nie wpływają na pliki EXE. – AaronLS

1

można spróbować patrząc svcutil.exe, który pozwala na generowanie kodu proxy po stronie klienta dla służby za pomocą wiersza poleceń. Powinieneś być w stanie pobrać plik kodu, który on tworzy i po prostu dodać go do swojego projektu DLL. To pozwala całkowicie obejść Visual Studio.

Powiązane problemy