SORU
23 Ocak 2011, Pazar


Başlatma ve durdurma IIS Express programlı

C küçük bir uygulama oluşturmak için çalışıyorum# Express IIS alt işlemi Durdur/Başlat. Bu amaçla resmi "" hangi MSDN belgelenmiştir: http://msdn.microsoft.com/en-us/library/gg418415.aspx . API IIS Express kullanmak istiyorum

Anladığım kadarıyla, API (sadece) COM arayüzleri dayanmaktadır. Bu COM kullanmak için Başvuru Ekle) VS2010 COM kitaplığı için bir başvuru - ^ ekledim arabirimleri . COM ->"IIS Yüklü Sürüm Yöneticisi Arayüzü":

Şimdiye kadar çok iyi, ama şimdi ne olacak? "Yöntem"/Başlat IIS işleminde dur. bu iki içerir IIISExprProcessUtility bir arabirim mevcuttur Bu arabirimi uygulayan bir sınıf yazmak zorunda mıyım?

public class test : IISVersionManagerLibrary.IIISExprProcessUtility
{
    public string ConstructCommandLine(string bstrSite, string bstrApplication, string bstrApplicationPool, string bstrConfigPath)
    {
        throw new NotImplementedException();
    }

    public uint GetRunningProcessForSite(string bstrSite, string bstrApplication, string bstrApplicationPool, string bstrConfigPath)
    {
        throw new NotImplementedException();
    }

    public void StopProcess(uint dwPid)
    {
        throw new NotImplementedException();
    }
} 

Gördüğünüz gibi, profesyonel bir geliştirici değilim. Birisi doğru yönde beni işaret edebilir. Herhangi bir yardım büyük beğeni topluyor.

Güncelleme 1: Önerileri doğrultusunda ne yazık ki işe yaramıyor aşağıdaki kodu denedim:

alt text Tamam, örneği olabilir ama bu nesneyi kullanmak için nasıl göremiyorum...

alt text

alt text

IISVersionManagerLibrary.IIISExpressProcessUtility test3 = (IISVersionManagerLibrary.IIISExpressProcessUtility) Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("5A081F08-E4FA-45CC-A8EA-5C8A7B51727C")));

Exception: Retrieving the COM class factory for component with CLSID {5A081F08-E4FA-45CC-A8EA-5C8A7B51727C} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

CEVAP
24 Ocak 2011, PAZARTESİ


Benzer bir şey yapmaya çalışıyordum. COM kitaplığı, Microsoft tarafından sağlanan eksik olduğu sonucuna vardım. Doktor bahsetmişti çünkü ben bunu kullanmıyorum "Not: Bu konu, yayın öncesi belgeler ve gelecek sürümlerde değişebilir.

Yani iisexpresstray.exe ne yaptığına bakmaya karar verdim. Benzer şeyler yapıyor gibi görünüyor.

Ben iisexpresstray.dll sökmeye ve tüm İİSexpress işlemler listesi ve İİSexpress işlemi duruyor büyü yok bulundu.

COM kitaplığı aramıyor. Kayıt defterinden bir şey arama değil.

Yani, ben sona erdi çözümü çok basit. IIS express bir süreci başlatmak için, ben sadece Süreci kullanın.() Başlangıç ve ihtiyacım olan tüm parametreleri.

IIS express işlemini durdurmak için, IISExpressTray.dll kod reflektör kullanarak kopyaladım. Sadece hedef İİSExpress işlemi için WM_QUIT mesajı gönderir gördüm.

Burada başlangıç ve IIS express işlemini durdurmak için yazdığım sınıf. Bu başkası yardımcı olur umarım.

class IISExpress
{
    internal class NativeMethods
    {
        // Methods
        [DllImport("user32.dll", SetLastError = true)]
        internal static extern IntPtr GetTopWindow(IntPtr hWnd);
        [DllImport("user32.dll", SetLastError = true)]
        internal static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);
        [DllImport("user32.dll", SetLastError = true)]
        internal static extern uint GetWindowThreadProcessId(IntPtr hwnd, out uint lpdwProcessId);
        [DllImport("user32.dll", SetLastError = true)]
        internal static extern bool PostMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
    }

    public static void SendStopMessageToProcess(int PID)
    {
        try
        {
            for (IntPtr ptr = NativeMethods.GetTopWindow(IntPtr.Zero); ptr != IntPtr.Zero; ptr = NativeMethods.GetWindow(ptr, 2))
            {
                uint num;
                NativeMethods.GetWindowThreadProcessId(ptr, out num);
                if (PID == num)
                {
                    HandleRef hWnd = new HandleRef(null, ptr);
                    NativeMethods.PostMessage(hWnd, 0x12, IntPtr.Zero, IntPtr.Zero);
                    return;
                }
            }
        }
        catch (ArgumentException)
        {
        }
    }

    const string IIS_EXPRESS = @"C:\Program Files\IIS Express\iisexpress.exe";
    const string CONFIG = "config";
    const string SITE = "site";
    const string APP_POOL = "apppool";

    Process process;

    IISExpress(string config, string site, string apppool)
    {
        Config = config;
        Site = site;
        AppPool = apppool;

        StringBuilder arguments = new StringBuilder();
        if (!string.IsNullOrEmpty(Config))
            arguments.AppendFormat("/{0}:{1} ", CONFIG, Config);

        if (!string.IsNullOrEmpty(Site))
            arguments.AppendFormat("/{0}:{1} ", SITE, Site);

        if (!string.IsNullOrEmpty(AppPool))
            arguments.AppendFormat("/{0}:{1} ", APP_POOL, AppPool);

        process = Process.Start(new ProcessStartInfo()
        {
            FileName = IIS_EXPRESS,
            Arguments = arguments.ToString(),
            RedirectStandardOutput = true,
            UseShellExecute = false
        });
    }

    public string Config { get; protected set; }
    public string Site { get; protected set; }
    public string AppPool { get; protected set; }

    public static IISExpress Start(string config, string site, string apppool)
    {
        return new IISExpress(config, site, apppool);
    }

    public void Stop()
    {
        SendStopMessageToProcess(process.Id);
        process.Close();
    }
}

Tüm varolan IIS express süreci listesine ihtiyacım yok. Eğer ihtiyacınız varsa, reflektör gördüğüm kadarıyla, iisexpresstray.dll ne Process.GetProcessByName("iisexpress", ".") aramak

Ben verilen sınıf kullanmak için, burada bir örnek program test etmek için kullandım.

class Program
{

    static void Main(string[] args)
    {
        Console.Out.WriteLine("Launching IIS Express...");
        IISExpress iis1 = IISExpress.Start(
            @"C:\Users\Administrator\Documents\IISExpress\config\applicationhost.config",
            @"WebSite1(1)",
            @"Clr4IntegratedAppPool");

        IISExpress iis2 = IISExpress.Start(
            @"C:\Users\Administrator\Documents\IISExpress\config\applicationhost2.config",
            @"WebSite1(1)",
            @"Clr4IntegratedAppPool");

        Console.Out.WriteLine("Press ENTER to kill");
        Console.In.ReadLine();

        iis1.Stop();
        iis2.Stop();
    }
}

Bu sorunuza bir cevap olmayabilir ama insanlar soru ilginç işimi yararlı olabilir bence. Kodları geliştirmek için çekinmeyin. Geliştirmek için isteyebileceğiniz bazı yerler vardır.

  1. Bu iisexpress.exe hardcoding yerine konum, benim kod kayıt defterinden okumak için düzeltme yapabilirsiniz.
  2. Tüm bağımsız değişkenleri iisexpress.exe tarafından desteklenen katmadım
  3. Hata işleme yapmadım. Eğer İİSExpress süreci bazı nedenlerden ötürü başlatmak için başarısız olursa, (örn: bağlantı noktası olarak kullanılır), bilmiyorum. Bunu düzeltmek için en kolay yolu ise StandardError akış bir şey çıkarsa StandardError akış monitörü ve özel durum olduğunu düşünüyorum

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • infodirt

    infodirt

    11 Mart 2009
  • iZAPPA

    iZAPPA

    16 Temmuz 2010
  • ShotgunSandwichENT

    ShotgunSandw

    3 EKİM 2012