2012-12-03 10 views
7

Utworzyłem aplikację Windows. Kiedy ręcznie wykonuję mój plik wykonywalny, działa on poprawnie, ale kiedy uruchamiam mój exe za pomocą usługi Windows, to pokazuje on błąd błędu. Używam Entity Framework. Czy jest jakiś problem z Entity Framework?Plik exe nie działa z mojej usługi Windows z łącznością z bazą danych?

Oto mój kod:

private void Threadfun() 
    { 
     try 
     {    
      System.Diagnostics.Process.Start(@"D:\V-Tec\bin\Debug\VibrantIndexerForm.exe"); 
      if (System.IO.File.Exists(@"D:\VibrantIndexerSetup\MarcExport1.txt")) 
      { 
      } 
      else 
      { 
       System.IO.File.Create(@"D:\VibrantIndexerSetup\MarcExport1.txt").Dispose(); 
      } 

      System.IO.File.WriteAllText(@"D:\VibrantIndexerSetup\MarcExport1.txt", System.DateTime.Now.ToString()); 
      System.Threading.Thread.Sleep(100); 
     } 
     catch (Exception ex) 
     { 
     }  
    } 

private void time_Elapsed(object sender, ElapsedEventArgs e) 
    { 

     m_thread = new System.Threading.Thread(new System.Threading.ThreadStart(Threadfun)); 
     if (m_thread.IsAlive) 
     { 
     } 
     else 
     { 
      m_thread.Start(); 
     } 
    } 

    protected override void OnStart(string[] args) 
    { 
     if (time.Enabled == false) 
     {  
      time.Elapsed += new ElapsedEventHandler(time_Elapsed); 
      time.Interval = 2000; 
      time.Enabled = true; 
     } 
    } 

    protected override void OnStop() 
    { 
     time.Enabled = false; 
    } 

Sprawdziłem moją usługę internetową i wydrukowany komunikat wyjątku do mojego notatnika, i znaleźć ten błąd:

The underlying provider failed on Open.

Ale mam tylko ten błąd przy uruchamianiu jako usługa Windows. Jeśli uruchomię mój exe ręcznie, to działa dobrze. Czy istnieje potrzeba dodawania odniesień w usługach Windows?

+2

spróbuj wyświetlić usługę windows logs.windows napisał tutaj wyjątki – Frank59

+0

Tak, znalazłem opis błędu w moim dzienniku systemu Windows, ale jak mogę to rozwiązać. –

+0

Czy możesz dodać opis błędu w swoim poście? – Frank59

Odpowiedz

1

Również uruchamiam moją aplikację za pośrednictwem usługi Windows. Sprawdzić, czy mój kod może pomóc

public class WindowsApi 
{ 

    [DllImport("Wtsapi32.dll", EntryPoint = "WTSQueryUserToken", SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool WTSQueryUserToken(uint SessionId, ref IntPtr phToken); 

    [DllImport("advapi32.dll", EntryPoint = "CreateProcessAsUserW", SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool CreateProcessAsUser([InAttribute()]IntPtr hToken, InAttribute(), MarshalAs(UnmanagedType.LPWStr)]string lpApplicationName, [InAttribute(), MarshalAs(UnmanagedType.LPWStr)] string lpCommandLine, [InAttribute()] IntPtr pProcessAttributes, [InAttribute()] IntPtr lpThreadAttributes, MarshalAs(UnmanagedType.Bool)] bool bInheritHandles, uint dwCreationFlags, [InAttribute()] IntPtr lpEnvironment, [InAttribute(), MarshalAsAttribute(UnmanagedType.LPWStr)] string pCurrentDirectory, ref STARTUPINFOW lpStartupInfo, ref PROCESS_INFORMATION lpProcessInformation); 

    [StructLayout(LayoutKind.Sequential)] 
    public struct SECURITY_ATTRIBUTES 
    { 
     public uint nLength; 
     public IntPtr lpSecurityDescriptor; 
     [MarshalAs(UnmanagedType.Bool)] 
     public bool bInheritHandle; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct STARTUPINFOW 
    { 
     public uint cb; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string lpReserved; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string lpDesktop; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string lpTitle; 
     public uint dwX; 
     public uint dwY; 
     public uint dwXSize; 
     public uint dwYSize; 
     public uint dwXCountChars; 
     public uint dwYCountChars; 
     public uint dwFillAttribute; 
     public uint dwFlags; 
     public ushort wShowWindow; 
     public ushort cbReserved2; 
     public IntPtr lpReserved2; 
     public IntPtr hStdInput; 
     public IntPtr hStdOutput; 
     public IntPtr hStdError; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct PROCESS_INFORMATION 
    { 
     public IntPtr hProcess; 
     public IntPtr hThread; 
     public uint dwProcessId; 
     public uint dwThreadId; 
    } 

} 

Umieść następujący kod w swoim sposobie

try 
    { 
     IntPtr UserTokenHandle = IntPtr.Zero; 
     WindowsApi.WTSQueryUserToken(WindowsApi.WTSGetActiveConsoleSessionId(), ref UserTokenHandle); 
     WindowsApi.PROCESS_INFORMATION ProcInfo = new WindowsApi.PROCESS_INFORMATION(); 
     WindowsApi.STARTUPINFOW StartInfo = new WindowsApi.STARTUPINFOW(); 
     StartInfo.cb = Convert.ToUInt32(System.Runtime.InteropServices.Marshal.SizeOf(StartInfo)); 
     string arguments = " nonGUI"; 
     WindowsApi.CreateProcessAsUser(UserTokenHandle, pathToExe + "\\YourAppName.exe", arguments, IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, null, ref StartInfo, ref ProcInfo); 

    catch (Exception ex) 
    { 
     //Catch excpetion 
    } 

To stworzy proces w bieżącym koncie użytkownika. Ten kod jest uruchomiony i działa.

Chciałbym, żeby to pomogło !! Twoje zdrowie !

+0

Nie można uzyskać przestrzeni nazw windowsapi? –

+0

możesz teraz uzyskać! Edytowałem odpowiedź :-) –

+0

Sprawdzam moją usługę sieci Web i wysyłam komunikat wyjątku do mojego notatnika, stwierdziłem ten błąd: "Dostawca podstawowy nie powiodło się na Open." ale ten błąd pojawia się tylko wtedy, gdy używam usługi okna. jeśli uruchamiam mój exe ręcznie działa dobrze –

Powiązane problemy