SORU
26 Mart 2009, PERŞEMBE


WCF servis oluşturmak yönetilmeyen C istemcileri için

Yönetilmeyen Windows C istemciler XML servisi konuşmak lazım. C istemciler 2000 ve daha sonra üzerinde çalışıyor olabilir. C API kullanılıyor olarak XML hizmeti ve üzerinde bir kontrolü var. Özel bir uygulama olduğu için tercih mümkünse Microsoft malzeme kullanımı, lisanslı API GNU kesinlikle değil. Bu olanlar, çalışmak, çalışma yapmak için nasıl adım adım bir süreci bizimle paylaşır mısınız?

Aşağıdaki seçenekleri şimdiye kadar araştırdım:

  • WWSAPİ - iyi değil, 2000 istemcileri üzerinde çalışmaz.
  • ATL Server, bir referans olarak following guide kullanılmış. Adımları ana hatlarıyla (politika başvuruları kaldırın ve dümdüz WSDL), ancak elde edilen WSDL hala sproxy tarafından kullanılamaz takip ettim

Başka fikri olan? Eğer gerçekten eğer kendiniz çalışıyorsanız tek cevap lütfen.

Edit1: Ben karışık olabilir herkes için özür dilerim: aradığım şey yok .nerede istemci(ler) XML servisi çağırmak için bir yol oldu NET çerçeve kullanarak çok yüklü .NET tabanlı kütüphane bir seçenek değil, saf olmalı yönetilmeyen C Yardımcısı

CEVAP
26 Mart 2009, PERŞEMBE


Temel fikir yazmak seçimden kodu müşterilerinize C# (sadece kolay bu şekilde) ve Kullan " C " köprü dll için köprü boşluğu arasında yönetilmeyen C kodu ve XML yönetilen kod C# ile yazılmış.

İşte adım adım süreci ile birlikte Visual Studio 2008 kullanarak .NET 3.5 SP1.

  1. Yapmanız gereken ilk şey, bisiklet Federasyonu Hizmet ve barındırmak için bir yol oluşturun. Eğer zaten varsa, Adım 7'ye atlayın. Aksi takdirde, here adımları izleyerek bir Windows NT Hizmeti oluşturun. Varsayılan adları proje için VS2008 ve projeye eklenen tüm sınıflar tarafından sunulan kullanın. Bu Windows NT Hizmeti, bisiklet Federasyonu Hizmet ev sahipliği yapacak.

    • Bir WCF Hizmeti projesi için HelloService adlı ekleyin. Bunu yapmak için, sağ Solution Explorer penceresinde proje ve Seç|Yeni Öğe... menü öğesi Ekleyin. Yeni Öğe Ekle iletişim,# XML C Hizmet şablonu seçin ve Ekle düğmesini tıklatın. Bu arayüz dosyası (İHelloService.şeklinde proje HelloService ekler cs), bir sınıf dosyası (HelloService.cs) ve varsayılan servis yapılandırma (app.dosyasını config).

    • Böyle HelloService tanımlayın

`

    [ServiceContract]
    public interface IHelloService
    {
        [OperationContract]
        string SayHello(string name);
    }
    public class HelloService : IHelloService
    {
        public string SayHello(string name)
        {
            return String.Format("Hello, {0}!", name);
        }
    }
  • Service1 sınıfı, Adım 1'de bu gibi bakmak için oluşturulan değiştirin:

    using System.ServiceModel;
    using System.ServiceProcess;
    public partial class Service1 : ServiceBase
    {
        private ServiceHost _host;
        public Service1()
        {
            InitializeComponent();
        }
        protected override void OnStart( string [] args )
        {
            _host = new ServiceHost( typeof( HelloService ) );
            _host.Open();
        }
        protected override void OnStop()
        {
            try {
                if ( _host.State != CommunicationState.Closed ) {
                    _host.Close();
                }
            } catch {
            }
        }
    }
    
  • Projeyi derleyin.

  • Visual Studio 2008 komut istemi açın. Bu proje için çıkış dizine gidin. Aşağıdakini yazın: `installutil WindowsService1.exe' Bu, Windows NT yerel makinenizde Hizmet yükler. Hizmetler denetim Masasını açın ve Service1 hizmetini başlatın. Önemli 9 Adım için aşağıda bu iş için.

    1. Visual Studio 2008 başka bir örneğini açın ve XML almak mümkün olduğunca uzakta olan bir MFC uygulaması oluşturun. Örnek olarak, ben sadece iletişim MFC uygulaması yarattı ve bir Merhaba Demek eklendi! bunun için düğme. Sağ Solution Explorer'da proje ve Özellikler menü seçeneği. Genel Ayarlar altında ..\Çıktı Dizinine\Debug bin değiştirin. C/C Genel Ayarlar altında ..\Ek içerik Dizinleri için HelloServiceClientBridge ekleyin. Linker altında Genel ayarları, Ek Kütüphane Dizinlere ..\Debug ekleyin. TAMAM düğmesine tıklayın.
  • Dosya menüsünden, seç|Yeni Proje... menü öğesi Ekleyin. C seç# Sınıf Kitaplığı şablonu. Adı HelloServiceClient ve TAMAM düğmesini tıklatın Değiştir. Sağ Solution Explorer'da proje ve Özellikler menü seçeneği. Yapı sekmesinde, ..\bin\için çıkış yolu çok derleme ve hata Ayıklama uygulaması değiştirin.yapılandırma dosyası MFC uygulama ile aynı dizinde olacak. Bu kütüphane Hizmeti Windows NT Hizmeti barındırılan seçimden Merhaba hizmet başvurusu, yani, XML proxy sınıfını içerir.

  • Solution Explorer, sağ Başvuruları HelloServiceClient proje için klasör Ekle ve Hizmet Başvuru... menü seçeneğini seçin. Merhaba servisinin adresini yazın Adresi alanına. Bu app temel adresini eşit olmalıdır.yapılandırma dosyası Adım 2'de oluşturduğunuz. Go düğmesini tıklatın. Merhaba Servis Hizmetleri listesinde göstermek gerekir. Tıklayın otomatik olarak oluşturmak için TAMAM düğmesine Merhaba Hizmet için proxy sınıfı(es).NOT:Her zaman Referans ile derleme sorunları içine çalıştırmak gibi görünüyor.cs dosyası bu işlem tarafından oluşturulan. Eğer yanlış yapıyorum yoksa eğer bir hata varsa bilmiyorum, ama bunu düzeltmek için en kolay yolu Başvurusunu değiştirin.cs dosyası doğrudan. Sorun genellikle namespacing bir konudur ve en az çaba ile düzeltilebilir. Bu sadece bir olasılık olduğunu unutmayın. Bu örnekte, HelloServiceClient değiştirdim.ServiceReference1 sadece HelloService (gerekli değişiklikleri ile birlikte).

  • MFC Uygulama XML hizmeti ile etkileşim için izin vermek için, yönetilen C "" VB. Köprüsü inşa etmeliyiz Dosya menüsünden, seç|Yeni Proje... menü öğesi Ekleyin. C win 32 Proje şablonu seçin. Adı HelloServiceClientBridge ve TAMAM düğmesini tıklatın Değiştir. Uygulama Ayarları için, DLL ve Boş proje onay için bu Uygulama Türünü değiştirin. Bitir düğmesine tıklayın.

  • Yapmanız gereken ilk şey proje özelliklerini değiştirmek. Sağ Solution Explorer'da proje ve Özellikler menü seçeneği. Genel Ayarlar altında ..\bin\Debug için Çıkış Dizinini değiştirmek ve Ortak Dil Ortak Dil çalışma Zamanı Desteği seçeneği değiştirmek çalışma Zamanı Desteği (/clr). Çerçevesinde ve Başvurular ayarları, bir başvuru ekleyin .NET Sistem, Sistem.ServiceModel ve mscorlib derlemeler. TAMAM düğmesine tıklayın.

  • HelloServiceClientBridge proje - HelloServiceClientBridge için aşağıdaki dosyaları ekleyin.h, İHelloServiceClientBridge.h ve HelloServiceClientBridge.cpp.

  • Bu İHelloServiceClientBridge değiştirin.h bu gibi görünmek için:

    #ifndef __IHelloServiceClientBridge_h__
    #define __IHelloServiceClientBridge_h__
    
    
    #include <string>
    
    
    #ifdef HELLOSERVICECLIENTBRIDGE_EXPORTS
    #define DLLAPI __declspec(dllexport)
    #else
    #define DLLAPI __declspec(dllimport)
    #pragma comment (lib, "HelloServiceClientBridge.lib") // if importing, link also
    #endif
    
    
    class DLLAPI IHelloServiceClientBridge
    {
    public:
        static std::string SayHello(char const *name);
    };
    
    
    #endif // __IHelloServiceClientBridge_h__
    
  • Bu HelloServiceClientBridge değiştirin.h bu gibi görünmek için:

    #ifndef __HelloServiceClientBridge_h__
    #define __HelloServiceClientBridge_h__
    
    
    #include <vcclr.h>
    #include "IHelloServiceClientBridge.h"
    
    
    #ifdef _DEBUG
    #using<..\HelloServiceClient\bin\Debug\HelloServiceClient.dll>
    #else
    #using<..\HelloServiceClient\bin\Release\HelloServiceClient.dll>
    #endif
    
    
    class DLLAPI HelloServiceClientBridge : IHelloServiceClientBridge
    { };
    
    
    #endif // __HelloServiceClientBridge_h__
    
  • Bu sözdizimi .cpp dosyası kullanır alışmak biraz zaman alıyor C , başardı. Bu helloserviceclientbridge.cpp bu gibi değiştirin:

    #include "HelloServiceClientBridge.h"
    
    
    using namespace System;
    using namespace System::Runtime::InteropServices;
    using namespace System::ServiceModel;
    using namespace System::ServiceModel::Channels;
    
    
    std::string IHelloServiceClientBridge::SayHello(char const *name)
    {
        std::string rv;
        gcroot<Binding^> binding = gcnew WSHttpBinding();
        gcroot<EndpointAddress^> address = gcnew EndpointAddress(gcnew String("http://localhost:8731/Design_Time_Addresses/WindowsService1/HelloService/"));
        gcroot<HelloService::HelloServiceClient^> client = gcnew HelloService::HelloServiceClient(binding, address);
        try {
            // call to WCF Hello Service
            String^ message = client->SayHello(gcnew String(name));
            client->Close();
            // marshal from managed string back to unmanaged string
            IntPtr ptr = Marshal::StringToHGlobalAnsi(message);
            rv = std::string(reinterpret_cast<char *>(static_cast<void *>(ptr)));
            Marshal::FreeHGlobal(ptr);
        } catch (Exception ^) {
            client->Abort();
        }
        return rv;
    }
    
  • Tek şey kaldı SayHello çağırmak için MFC uygulama update() XML servisi arayın. MFC formu çift tıklatın Merhaba Deyin! düğme ButtonClicked olay işleyicisi oluşturmak için. Olay işleyicisi bu gibi görünmesini sağlayın:

    #include "IHelloServiceClientBridge.h"
    #include <string>
    void CMFCApplicationDlg::OnBnClickedButton1()
    {
        try {
            std::string message = IHelloServiceClientBridge::SayHello("Your Name Here");
            AfxMessageBox(CString(message.c_str()));
        } catch (...) {
        }
    }
    
  • Uygulama ve tıklatın Selam çalıştırın! düğme. Bu uygulama neden olur SayHello() çağırmak seçimden yöntemi Alo Hizmeti Windows NT Hizmeti barındırılan bu arada, hala çalışıyor olmalıdır). Dönüş değeri, bir ileti kutusu görüntülenir.

Umarım sizin ihtiyaçlarınıza göre bu basit örnekten tahmin edebilirsiniz. Eğer bu iş olursa, lütfen bana mesaj düzeltebilirim böylece bildir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • stewmurray47

    stewmurray47

    1 Kasım 2006
  • taliajoy18

    taliajoy18

    12 Temmuz 2011
  • Ty Moss

    Ty Moss

    20 Kasım 2007